/**
 * @mergeTarget
 * @module Src/Screens/Reset
 */
import {
  LisioCategoryNames,
  LisioParameterNames,
  LisioProfileNames,
} from "@lisio/lisio-profils";
import { LisioScreen } from "../lisio-screen";
import { CustomButton } from "../../components/custom-button/custom-button";
import { CustomText } from "../../components/custom-text/custom-text";
import {
  BooleanParameterRenderObject,
  StringParameterRenderObject,
  NumberParameterRenderObject,
  CategoryRenderObject,
  ProfileRenderObject,
  ScreenNames,
} from "../screen-types";
import { UserController } from "../../../controllers/user-controller";
import { InputManager } from "../../../managers/input-manager";
import { MessageManager } from "../../../managers/message-manager";
import { ScreenManager } from "../../../managers/screen-manager";
import { LisioComponent } from "@lisio/lisio-engine";
import { ElementsContainer } from "../../components/containers/elements-container/elements-container";
import { ManagementScreen } from "../management/management-screen";

/**
 * Class representing a reset screen component extending LisioScreen.\
 * It aims to represent a reset screen component.\
 * A reset screen component is basically a component to render all reset categories, profiles and parameters.\
 */
class ResetScreen extends LisioScreen {
  /**
   * Protected attribute to store category render objects
   * @source
   */
  protected _categoryRenderObjects: Map<
    LisioCategoryNames,
    CategoryRenderObject
  > = new Map<LisioCategoryNames, CategoryRenderObject>();

  /**
   * Protected attribute to store profile render objects
   * @source
   */
  protected _profileRenderObjects: Map<LisioProfileNames, ProfileRenderObject> =
    new Map<LisioProfileNames, ProfileRenderObject>();

  /**
   * Protected attribute to store parameter render objects
   * @source
   */
  protected _parameterRenderObjects: Map<
    LisioParameterNames,
    | BooleanParameterRenderObject
    | StringParameterRenderObject
    | NumberParameterRenderObject
  > = new Map<
    LisioParameterNames,
    | BooleanParameterRenderObject
    | StringParameterRenderObject
    | NumberParameterRenderObject
  >();

  /**
   * @async
   * Public method implementing abstract method render of LisioComponent
   * @returns Returns a promise containing the representation of a reset screen in HTML string
   * @source
   */
  public async render(): Promise<string> {
    return `
    <section id="${this._id}">
      <children></children>
    </section>
    `;
  }

  /**
   * Constructor of class {@link ResetScreen | ResetScreen}
   * @source
   */
  constructor() {
    ScreenNames[ResetScreen.name] = "reset-screen";
    super(ResetScreen.name, ResetScreen.name, undefined, ManagementScreen.name);
    const elementsTitleContainer: LisioComponent = new ElementsContainer(
      [
        this.createScreenSubtitle("management-title"),
        this.createScreenTitle("reset-title"),
      ],
      undefined,
      ["column gap-0"],
    );
    this.children.push(
      elementsTitleContainer,
      new ElementsContainer(
        [new CustomText("p", "infobox-reset", false, ["infobox", "info-text"])],
        undefined,
        ["infobox", "column", "width-100", "secondary"],
      ),
      new CustomButton(
        "reset-button",
        [new CustomText("p", "reset-all", false, ["medium", "white"])],
        async (e) => {
          InputManager.current.disableAll(true);
          await UserController.current?.deleteAllUsers();
          ScreenManager.current.changeScreen(
            ScreenManager.current.nav?.navButtons[0],
            e.detail,
          );
          MessageManager.current?.sendDisableAllMessage();
          MessageManager.current.flagIso =
            MessageManager.current.defaultFlagIso;
          MessageManager.current?.sendTranslationLanguageChangeMessage();
          document
            .querySelector("div#hiddable-container")
            ?.classList.remove("hidden");
        },
        ["red", "width-55", "btn-pill"],
        {
          label: {
            id: "aria-reset",
          },
        },
      ),
    );
  }
}

export { ResetScreen };
