/**
 * @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 { ScreenNames } from "../render/screens/screen-types";
import { TranslationScreen } from "../render/screens/translation/translation-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 { ComfortScreen } from "../render/screens/comfort/comfort-screen";
import { DyslexiaScreen } from "../render/screens/dyslexia/dyslexia-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 WelcomeVersion 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.DEEPL_TRANSLATION} transaltionMde - 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.DEEPL_TRANSLATION,
    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),
    };

    this.addTranslation(
      groupOne,
      screensToHide.categoriesToHide,
      screensToHide.profilesToHide,
      screensToHide.parametersToHide,
      translationMode,
      priorizedLanguages,
      translationLangISOsAuthorized,
      undefined,
    );
    // this.addGroupIfNotEmpty(groupOne, categoriesGroups);

    // const groupTwo: Group = {
    //   categories: [],
    //   profiles: [],
    //   parameters: [],
    //   position: this.getGroupPosition(1, groupsOrder),
    // };
    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);
    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[TranslationScreen.name],
    );
  }

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

export { WelcomeVersion };
