
import { lazy } from "react";
import { IArmisaPageKey } from "../ArmisaImportPage";
import { MainStateManager } from "../MainStateManager";
import { IMainStateFactory } from "../Types";
import { PageTabingFactory } from "./PageTabingFactory";
import { SubPageFactory } from "./SubPageFactory";


export class PageFactory {
    public get any(): any {
        return this;
    }
    public mainStateManager: MainStateManager;
    public mainStateFactory?: IMainStateFactory;
    public forceUpdate: () => void;
    public forceUpdateHeadr: () => void;
    public forceUpdateToolStrip: () => void;
    public id: string;
    public Component: React.LazyExoticComponent<React.ComponentType<any>>;
    #hasChange: boolean;
    public get hasChange(): boolean {
        return this.#hasChange;
    }

    public get isActivePage(): boolean {
        return this.tabPageContainer.activeTab === this;
    }

    constructor(
        public tabPageContainer: PageTabingFactory,
        public pageKey: string,
        public caption: string,
        lazyLoadPage: (pageKey: IArmisaPageKey) => React.LazyExoticComponent<React.ComponentType<any>>
    ) {
        this.id = Math.random().toString() + '-' + new Date().getMilliseconds().toString();
        this.mainStateManager = this.tabPageContainer.mainStateManager;
        this.Component = lazyLoadPage(this.pageKey as IArmisaPageKey);
        this.#hasChange = false;
        this.forceUpdate = () => { };
        this.forceUpdateHeadr = () => { };
        this.forceUpdateToolStrip = () => { };
    }

    public close() {
        this.tabPageContainer.closeThisTab(this);
    }

    public subPages: SubPageFactory[] = [];
    public subPagesOrder: SubPageFactory[] = [];
    public activeSubPage?: SubPageFactory;

    closeThisSubPage = (subPage: SubPageFactory) => {
        this.subPages = this.subPages.filter((t) => t !== subPage);
        this.subPagesOrder = this.subPagesOrder.filter((t) => t !== subPage);

        if (this.subPagesOrder.length > 0) {
            this.activeSubPage = this.subPagesOrder[this.subPagesOrder.length - 1];
        } else {
            this.activeSubPage = undefined;
        }

        this.forceUpdate();
    }
    selectThisSubPage = (subPage: SubPageFactory) => {
        const newSubPage = this.subPagesOrder.filter((t) => t !== subPage);
        newSubPage.push(subPage);
        this.subPagesOrder = newSubPage;
        this.forceUpdate();
    }
}
