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

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

/**
 * Handler for received message {@link Src/Messages/Received.ReceivedMessageNames.DICO_API | DICO_API}.\
 * This function searches definition of the word sent by client script using dico API and sent results using message {@link Src/Messages/Sent.SentMessageNames.DICO_API_RESPONSE | DICO_API_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 dicoAPIHandler(
  this: MessageManager,
  datas: string,
): Promise<void> {
  const parsedDatas = JSON.parse(datas);
  fetchWithTimeout(
    `${import.meta.env.VITE_URL_DICTIONARY_API}/api/dictionary/${
      parsedDatas.word
    }`,
    {
      method: "GET",
      headers: {
        Authorization: `Bearer ${import.meta.env.VITE_SECRET_DICTIONARY_API}`,
        "Content-Type": "application/json",
      },
      timeout: 10000,
    },
  )
    .then((datas) => {
      if (datas.status !== 200) {
        throw new Error(`${datas.status} : ${datas.statusText}`);
      }
      return datas.json();
    })
    .then((response) => {
      if (response && !response.error) {
        this.sendDicoAPIResponseMessage(JSON.parse(response.datas));
      } else {
        throw new Error(response.message);
      }
    })
    .catch((err) => {
      console.log(err);
    });
}

export { dicoAPIHandler };
