/**
 * @mergeTarget
 * @module Src/Versions/All
 */

import {
  LisioCategoryNames,
  LisioParameterNames,
  LisioProfileNames,
} from "@lisio/lisio-profils";
import { Group, WidgetVersion } from "./widget-version";
import { HomeScreen } from "../render/screens/home/home-screen";
import { LisioScreen } from "../render/screens/lisio-screen";
import { DaltonismScreen } from "../render/screens/daltonism/daltonism-screen";
import { MoreScreen } from "../render/screens/more/more-screen";
import { ResetScreen } from "../render/screens/reset/reset-screen";
import { UsersScreen } from "../render/screens/users/users-screen";
import { ManagementScreen } from "../render/screens/management/management-screen";
import { ScreenNames } from "../render/screens/screen-types";
import { TranslationScreen } from "../render/screens/translation/translation-screen";
import { ComfortScreen } from "../render/screens/comfort/comfort-screen";
import { DyslexiaScreen } from "../render/screens/dyslexia/dyslexia-screen";
import { SynthScreen } from "../render/screens/synth/synth-screen";
import { RuralScreen } from "../render/screens/rural/rural-screen";
import { EcoScreen } from "../render/screens/eco/eco-screen";
import { AccessibilityScreen } from "../render/screens/accessibility/accessibility-screen";

/**
 * Class representing the first version of widget extending WidgetVersion.\
 * It aims to define all features of first version.\
 * A widget version allows to define which screen and features has to be included.\
 * To execute his responsability this class includes :
 *  * Home screen
 *  * Accessibility screen
 *  * Settings screen
 *  * More screen
 *  * Management screen
 *  * Users screen
 *  * Reset screen\
 * Here the screen tree :\
 * ![Complete screen tree](media://first_version_screen_tree.webp)
 */
class FirstVersion extends WidgetVersion {
  /**
   * @async
   * Public method to initialize version implementing parent method
   * @param {object} screensToHide - Object to indicates screens to hide
   * @property {LisioCategoryNames[]} screensToHide.categoriesToHide - Categories to hde
   * @property {LisioProfileNames[]} screensToHide.profilesToHide - Profiles to hide
   * @property {LisioParameterNames[]} screensToHide.parametersToHide - Parameters to hide
   * @param {LisioCategoryNames.GOOGLE_TRANSLATION | LisioCategoryNames.DEEPL_TRANSLATION | undefined} _ - Translation mode if version has translation
   * @param {object | undefined} groupsOrder - Groups order
   * @returns Returns a promise containing nothing
   * @source
   */
  public async initialize(
    screensToHide: {
      categoriesToHide: LisioCategoryNames[];
      profilesToHide: LisioProfileNames[];
      parametersToHide: LisioParameterNames[];
    },
    _:
      | LisioCategoryNames.GOOGLE_TRANSLATION
      | LisioCategoryNames.DEEPL_TRANSLATION
      | undefined,
    __: string[],
    ___: string[],
    isCompensation: boolean,
    isFlag: boolean,
    groupsOrder?: { groupId: number; position: number }[],
  ) {
    const categoriesGroups: Group[] = [];

    const groupOne: Group = {
      categories: [],
      profiles: [],
      parameters: [],
      position: this.getGroupPosition(0, groupsOrder),
    };
    if (
      !screensToHide.categoriesToHide.includes(LisioCategoryNames.ACCESSIBILITY)
    ) {
      this.addAccessibility(
        groupOne,
        screensToHide.categoriesToHide,
        screensToHide.profilesToHide,
        screensToHide.parametersToHide,
        undefined,
      );
    }
    // this.addGroupIfNotEmpty(groupOne, categoriesGroups);

    // const groupTwo: Group = {
    //   categories: [],
    //   profiles: [],
    //   parameters: [],
    //   position: this.getGroupPosition(1, groupsOrder),
    // };
    if (
      !screensToHide.categoriesToHide.includes(
        LisioCategoryNames.LIGHT_ECOLOGICAL,
      )
    ) {
      this.addLightEco(
        // groupTwo,
        groupOne,
        screensToHide.categoriesToHide,
        screensToHide.profilesToHide,
        screensToHide.parametersToHide,
        undefined,
      );
    }
    // this.addGroupIfNotEmpty(groupTwo, categoriesGroups);

    // const groupThree: Group = {
    //   categories: [],
    //   profiles: [],
    //   parameters: [],
    //   position: this.getGroupPosition(2, groupsOrder),
    // };
    if (!screensToHide.categoriesToHide.includes(LisioCategoryNames.SETTINGS)) {
      this.addSettings(
        // groupThree,
        groupOne,
        screensToHide.categoriesToHide,
        screensToHide.profilesToHide,
        screensToHide.parametersToHide,
        undefined,
      );
    }
    // this.addGroupIfNotEmpty(groupThree, categoriesGroups);
    this.addGroupIfNotEmpty(groupOne, categoriesGroups);

    this.addMore();
    this.addManagement();

    categoriesGroups.sort((a, b) => a.position - b.position);
    const homeScreen: LisioScreen = new HomeScreen(
      isCompensation,
      isFlag,
      categoriesGroups,
    );
    this._screens.set(ScreenNames[HomeScreen.name], homeScreen);
    this._mainScreen = this._screens.get(
      __BUILD_TARGET__ === "extension"
        ? ScreenNames[HomeScreen.name]
        : ScreenNames[AccessibilityScreen.name],
    );
  }

  /**
   * Constructor of class {@link EssentialVersion | EssentialVersion}
   * @source
   */
  constructor() {
    super();

    this._screensToIgnoreInNav.push(
      DaltonismScreen.name,
      ComfortScreen.name,
      DyslexiaScreen.name,
      RuralScreen.name,
      TranslationScreen.name,
      SynthScreen.name,
      EcoScreen.name,
      UsersScreen.name,
      ResetScreen.name,
      MoreScreen.name,
      HomeScreen.name,
      ManagementScreen.name,
    );
  }
}

export { FirstVersion };
