/**
 * @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 { DyslexiaScreen } from "../render/screens/dyslexia/dyslexia-screen";
import { UsersScreen } from "../render/screens/users/users-screen";
import { ResetScreen } from "../render/screens/reset/reset-screen";
import { MoreScreen } from "../render/screens/more/more-screen";
import { ManagementScreen } from "../render/screens/management/management-screen";
import { ScreenNames } from "../render/screens/screen-types";
import { AccessibilityScreen } from "../render/screens/accessibility/accessibility-screen";

/**
 * Class representing the complete version of widget extending WidgetVersion.\
 * It aims to define all features of complete 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
 *  * Daltonism screen
 *  * Comfort screen
 *  * Dyslexia screen
 *  * Rural screen
 *  * Translations screen
 *  * Speech synthesis screen
 *  * Eco screen
 *  * Settings screen
 *  * More screen
 *  * Management screen
 *  * Users screen
 *  * Reset screen\
 * Here the screen tree :\
 * ![Complete screen tree](media://complete_version_screen_tree.webp)
 */
class CompleteVersion 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} translationMode - 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[];
    },
    translationMode:
      | LisioCategoryNames.GOOGLE_TRANSLATION
      | LisioCategoryNames.DEEPL_TRANSLATION
      | undefined,
    priorizedLanguages: string[],
    translationLangISOsAuthorized: 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,
      );
    } else {
      this.hideAllOfCategory(LisioCategoryNames.ACCESSIBILITY);
    }
    if (!screensToHide.categoriesToHide.includes(LisioCategoryNames.COMFORT)) {
      this.addComfort(
        groupOne,
        screensToHide.categoriesToHide,
        screensToHide.profilesToHide,
        screensToHide.parametersToHide,
        undefined,
      );
    } else {
      this.hideAllOfCategory(LisioCategoryNames.COMFORT);
    }
    if (!screensToHide.categoriesToHide.includes(LisioCategoryNames.RURAL)) {
      this.addLowNetwork(
        groupOne,
        screensToHide.categoriesToHide,
        screensToHide.profilesToHide,
        screensToHide.parametersToHide,
        undefined,
      );
    } else {
      this.hideAllOfCategory(LisioCategoryNames.RURAL);
    }
    this.addManagement();
    // this.addGroupIfNotEmpty(groupOne, categoriesGroups);

    // const groupTwo: Group = {
    //   categories: [],
    //   profiles: [],
    //   parameters: [],
    //   position: this.getGroupPosition(1, groupsOrder),
    // };
    if (
      !screensToHide.categoriesToHide.includes(
        LisioCategoryNames.GOOGLE_TRANSLATION,
      ) &&
      !screensToHide.categoriesToHide.includes(
        LisioCategoryNames.DEEPL_TRANSLATION,
      ) &&
      translationMode != undefined
    ) {
      this.addTranslation(
        // groupTwo,
        groupOne,
        screensToHide.categoriesToHide,
        screensToHide.profilesToHide,
        screensToHide.parametersToHide,
        translationMode,
        priorizedLanguages,
        translationLangISOsAuthorized,
        undefined,
      );
    } else {
      this.hideAllOfCategory(LisioCategoryNames.GOOGLE_TRANSLATION);
      this.hideAllOfCategory(LisioCategoryNames.DEEPL_TRANSLATION);
    }
    if (
      !screensToHide.categoriesToHide.includes(
        LisioCategoryNames.SPEECH_SYNTHESIS,
      )
    ) {
      this.addSpeechSynthesis(
        // groupTwo,
        groupOne,
        screensToHide.categoriesToHide,
        screensToHide.profilesToHide,
        screensToHide.parametersToHide,
        undefined,
      );
    } else {
      this.hideAllOfCategory(LisioCategoryNames.SPEECH_SYNTHESIS);
    }
    // this.addGroupIfNotEmpty(groupTwo, categoriesGroups);

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

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

    this.addMore();

    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 CompleteVersion | CompleteVersion}
   * @source
   */
  constructor() {
    super();

    this._screensToIgnoreInNav.push(
      DaltonismScreen.name,
      DyslexiaScreen.name,
      UsersScreen.name,
      ResetScreen.name,
      MoreScreen.name,
      HomeScreen.name,
      ManagementScreen.name,
    );
  }
}

export { CompleteVersion };
