/**
 * @mergeTarget
 * @module Src/Messages/Received/Handlers
 */

import { fetchWithTimeout } from "../../../misc/functions";
import { MessageManager } from "../../managers/message-manager";
import { TranslatorAPIDatas } from "../message-types";

/**
 * Handler for received message {@link Src/Messages/Received.ReceivedMessageNames.TRANSLATOR_API_TRANSLATE | TRANSLATOR_API_TRANSLATE}.\
 * This function translate texts sent by client script using translator API and sent results using message {@link Src/Messages/Sent.SentMessageNames.TRANSLATOR_API_TRANSLATE_RESPONSE | TRANSLATOR_API_TRANSLATE_RESPONSE}.
 * @async
 * @param {MessageManager} this - Context of {@link Src/Managers.MessageManager | MessageManager}
 * @param {string} datas - Additional datas sent by client script.\
 *  Datas contains : {@link Src/Messages/Types.TranslatorAPIDatas | TranslatorAPIDatas}
 * @returns Returns a promise containing nothing
 * @source
 */
async function translatorAPITranslateHandler(
  this: MessageManager,
  datas: string,
): Promise<void> {
  const parsedDatas: TranslatorAPIDatas = JSON.parse(datas);
  fetchWithTimeout(
    `${
      import.meta.env.VITE_URL_TRANSLATOR_API
    }/api/translation/getWithFilter?domainName=${this.originDomain}`,
    {
      method: "POST",
      headers: {
        Authorization: `Bearer ${import.meta.env.VITE_SECRET_TRANSLATOR_API}`,
        "Content-Type": "application/json",
      },
      body: JSON.stringify(parsedDatas.body),
      timeout: 10000,
    },
  )
    .then((datas) => {
      return datas.json();
    })
    .then((response) => {
      if (response.datas) {
        const textObjs = JSON.parse(response.datas);
        this.sendTranslatorAPITranslateResponseMessage(
          parsedDatas.keyHandler,
          textObjs,
        );
      } else {
        throw new Error(response.message);
      }
    })
    .catch((err) => {
      console.log(err);
    });
}

export { translatorAPITranslateHandler };
