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

import {
  LisioBooleanParameterNames,
  LisioProfileNames,
} from "@lisio/lisio-profils";
import { CompressorController } from "../../controllers/compressor-controller";
import { MessageManager } from "../../managers/message-manager";
import { InputManager } from "../../managers/input-manager";
import { UserController } from "../../controllers/user-controller";

/**
 * Handler for received message {@link Src/Messages/Received.ReceivedMessageNames.POPUP_RESPONSE | POPUP_RESPONSE}.\
 * This function handle response of book page popup :
 *  * If user want to go to book page, it's send a message {@link Src/Messages/Sent.SentMessageNames.NEW_TAB | NEW_TAB} to client script with all users compressed and formated in base64
 *  * If user doesn't want to go to book page, it's send a message {@link Src/Messages/Sent.SentMessageNames.DISABLE_ALL | DISABLE_ALL} to client script
 * @async
 * @param {MessageManager} this - Context of {@link Src/Managers.MessageManager | MessageManager}
 * @param {string} datas - Additional datas sent by client script
 * @returns Returns a promise containing nothing
 * @source
 */
async function popupResponseHandler(
  this: MessageManager,
  datas: string,
): Promise<void> {
  const parsedDatas: {
    value: boolean;
    focus?: string;
    parameter: LisioBooleanParameterNames;
  } = JSON.parse(datas);
  if (parsedDatas.value) {
    if (parsedDatas.parameter === LisioBooleanParameterNames.BOOK_PAGE) {
      const usernames = JSON.stringify(UserController.current.usernames);
      const formatedUsers = [];
      for (const user of UserController.current.users.values()) {
        formatedUsers.push(user.formatForSaving());
      }
      this.sendNewTabMessage(
        "default",
        UserController.current.currentUser?.profiles.includes(
          LisioProfileNames.LOW_NETWORK,
        ) ||
          UserController.current.currentUser?.profiles.includes(
            LisioProfileNames.ECOLO,
          ),
        true,
        `lisioUsernames${encodeURIComponent(
          `=${btoa(usernames)}`,
        )}&lisioUsers${encodeURIComponent(
          `=${CompressorController.current.encodeUsers(formatedUsers)}`,
        )}`,
      );
    } else {
      this.sendReadingModeResponseMessage();
    }
  } else {
    InputManager.current.disableAllBookPageOrReading();
    UserController.current.disableAllBookPageOrReading();

    if (UserController.current.currentUser != undefined) {
      // for (const profileName of UserController.current.currentUser.profiles) {
      //   const profile: LisioProfile =
      //     LisioProfileFactory.current.buildLisioProfile(profileName);
      //   for (const parameter of profile.parameters.values()) {
      //     if (parametersToAdapt[parameter.name] == undefined) {
      //       parametersToAdapt[parameter.name] = parameter;
      //     } else if (
      //       typeof parameter.value === "number" &&
      //       (parametersToAdapt[parameter.name].value as number) <
      //         parameter.value
      //     ) {
      //       parametersToAdapt[parameter.name] = parameter;
      //     }
      //   }
      // }
      // for (const parameter of UserController.current.currentUser
      //   .customParameters) {
      //   parametersToAdapt[parameter[0]] = parameter[1];
      // }
      await new Promise((res) => {
        setTimeout(() => {
          if (UserController.current.currentUser != undefined) {
            InputManager.current.refreshInputs(
              UserController.current.currentUser.profiles,
              Array.from(
                UserController.current.currentUser.customParameters.values(),
              ),
            );
          }
          res(true);
        }, 1000);
      });
      await UserController.current.checkIfUserNeedToBeDeleted();
    } else {
      MessageManager.current.sendDisableAllMessage();
    }
    document
      .querySelector<HTMLElement>(`#${parsedDatas.focus}`)
      ?.closest("button")
      ?.focus();
  }
}

export { popupResponseHandler };
