/**
 * @ignore
 * @mergeTarget
 * @module Src/Main
 */

import { LisioCategoryNames } from "@lisio/lisio-profils";
import { MessageManager } from "./modules/managers/message-manager.ts";
import { TranslationLanguages } from "./modules/controllers/translation/translation-controller.ts";
import { UserController } from "./modules/controllers/user-controller.ts";
import { ReceivedMessageNames } from "./modules/messages/received-message-names.ts";
import { InitMessageDatas } from "./modules/messages/message-types.ts";
import { InputManager } from "./modules/managers/input-manager.ts";
import { CompressorController } from "./modules/controllers/compressor-controller.ts";
import { AssetsLoader, Engine } from "@lisio/lisio-engine";
import {
  Icon,
  IconsObject,
} from "./modules/render/components/component-types.ts";
import { LisioWidgetVersionFactory } from "./modules/versions/widget-version-factory.ts";

async function startWidget() {
  new Engine();
  new AssetsLoader(
    "./assets",
    async (entry: {
      isIntersecting: any;
      intersectionRatio: number;
      target: Element;
    }) => {
      if (entry.isIntersecting && entry.intersectionRatio >= 1) {
        const element: Element = entry.target;
        const fileName: string | null = element.getAttribute("data-file-name");
        const iconName: string | null = element.getAttribute("data-icon-name");
        if (fileName != undefined && iconName != undefined) {
          if (element.tagName.toLowerCase() === "svg") {
            const icon: Icon = (
              await AssetsLoader.current.loadAsset<IconsObject>(
                `./icons/${fileName}.ts`,
              )
            )[iconName];
            element.setAttribute("width", icon.width.toString());
            element.setAttribute("height", icon.height.toString());
            element.setAttribute("viewBox", `0 0 ${icon.width} ${icon.height}`);
            // const parser = new DOMParser();
            // const draw = parser.parseFromString(icon.svg, "image/svg+xml");
            // for(const path of draw.children){
            //   element.appendChild(path);
            // }
            element.innerHTML = icon.svg;
            // "<g clip-path="url(#a)"><path fill="currentColor" d="M10.6 16.1c.6 0 .9-.2 1-.9l1-2.7h5l1 2.7c.2.7.5 1 1.1 1 .6 0 1-.5 1-1v-.7l-4-10.4c-.2-.8-.7-1.2-1.5-1.2s-1.3.4-1.6 1.2L9.7 14.6l-.1.6c0 .6.4 1 1 1Zm2.6-5.2 2-5.7 2 5.7Z5.7 16c.4 0 .7-.2.9-.8l.6-1.8h3.4l.6 1.8c.2.6.5.8 1 .8s.9-.3.9-.8l-.1-.7-2.7-7c-.2-.8-.7-1.1-1.4-1.1s-1.1.3-1.4 1L0 14.6l-.1.7c0 .5.3.8.9.8Zm2-4 1.1-3.7H4l1.2 3.7Zm0 0"/></g><g clip-path="url(#b)"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 600M6 4v16M6 4 3 7m3-3 3 3M6 20l-3-3m3 3 3-3" transform="matrix(0 -1.01052 .99699 0 3 28)"/></g>"
          }
        }
        element.removeAttribute("data-file-name");
        element.removeAttribute("data-icon-name");
      }
    },
  );
  new LisioWidgetVersionFactory();

  const userController = new UserController();
  await userController.checkStorageVersion();
  await userController.getAllUsers();
  await userController.getNextUserNumber();
  await userController.getSelectedUser().catch((error: Error) => {
    error;
  });

  new CompressorController();
  new InputManager();
  const messageManager = new MessageManager();

  if (__BUILD_TARGET__ === "extension") {
    document.documentElement.style.width = "360px";
    document.documentElement.style.height = "600px";
    const initMessageDatas: InitMessageDatas = {
      widgetLang: TranslationLanguages.FR,
      origin: "*",
      url: "",
      widgetVersion: 2,
      categoriesToHide: [
        LisioCategoryNames.GOOGLE_TRANSLATION,
        LisioCategoryNames.DEEPL_TRANSLATION,
      ],
      profilesToHide: [],
      parametersToHide: [],
      priorizedLanguages: [],
      translationMode: LisioCategoryNames.DEEPL_TRANSLATION,
      statisticsAPIURL: "",
      bookPageUrlQueries: [],
      isReferrerBookPage: false,
      colors: {
        primary: "#015E86",
        eco: "#0f6635",
      },
      originDomain: "",
      compensation: true,
      shortcutTo: "",
      popinUsed: "popin2025",
    };

    const handler = messageManager.messageHandlers.get(
      ReceivedMessageNames.INIT_BACK,
    );
    if (handler != undefined) {
      handler(JSON.stringify(initMessageDatas));
    }
  }

  if (
    window.location.origin === "http://localhost:5173" ||
    window.location.origin === "http://127.0.0.1:5173"
  ) {
    const initMessageDatas: InitMessageDatas = {
      widgetLang: TranslationLanguages.FR,
      origin: "*",
      url: "",
      widgetVersion: 2,
      categoriesToHide: [],
      profilesToHide: [],
      parametersToHide: [],
      priorizedLanguages: [],
      translationMode: LisioCategoryNames.DEEPL_TRANSLATION,
      statisticsAPIURL: "",
      bookPageUrlQueries: [],
      isReferrerBookPage: false,
      colors: {
        primary: "#015e66",
        eco: "#0f6635",
      },
      originDomain: "",
      compensation: true,
      shortcutTo: "",
      popinUsed: "popin2025",
    };

    window.postMessage(
      {
        name: ReceivedMessageNames.INIT_BACK,
        datas: initMessageDatas,
      },
      "*",
    );
  }
}

startWidget();
