import { MainStateManager } from "./MainStateManager";
import { IFinancialPeriod, FinancialPeriod } from "./FinancialPeriods";
import { TabPageData } from "./Page/Tab/TabData";
import { BasePageData } from "./Page/BasePageData";

export interface IData {
    id: number,
    isActive: boolean,
    name: string,
    caption: string,
    financialPeriods: IFinancialPeriod[];
    owner?: boolean,
}

export class Data {
    public financialPeriods: FinancialPeriod[] = [];
    constructor(
        public mainStateManager: MainStateManager,
        public id: number,
        public isActive: boolean,
        public name: string,
        public caption: string,
        public owner?: boolean,
    ) { }
}

export class Dataing {
    public waitForChangeData: boolean = false;
    public waitForChangeFinancialPeriod?: string;
    changeToSelectedDataAndFinancialPeriod = () => {
        if (this.waitForBeingActiveData && this.waitForBeingActiveFinancialPeriod) {
            this.waitForChangeData = true;
            this.pageData.Eventing.trigger('form.waitLoading');
            // this.mainStateManager.Usering.LoginFactory.startToChangeDataBase(this.waitForBeingActiveData.id, this.waitForBeingActiveFinancialPeriod.id, true);
        }
    }
    closeSelectModel = () => {
    }

    // selectActiveData = () => {
    //     if (this.mainStateManager.Tabing.tabs.length === 0 && this.mainStateManager.Modaling.modals.length === 0) {
    //         this.mainStateManager.Modaling.addModalPage('select-active-data', 40, 80);
    //     }
    // }

    goToNextRow = () => {
        const lengths = this.datas.length - 1;
        const focusIndex = this.datas.findIndex(i => i === this.waitForBeingActiveData);
        if (focusIndex > -1 && focusIndex + 1 <= lengths) {
            this.waitForBeingActiveData = this.datas[focusIndex + 1];
        } else {
            this.waitForBeingActiveData = this.datas[0];
        }
        this.pageData.Eventing.trigger('form.change');
    }

    goToPreviousRow = () => {
        const lengths = this.datas.length - 1;
        const focusIndex = this.datas.findIndex(i => i === this.waitForBeingActiveData);
        if (focusIndex && focusIndex > 0) {
            this.waitForBeingActiveData = this.datas[focusIndex - 1];
        } else {
            this.waitForBeingActiveData = this.datas[lengths];
        }
        this.pageData.Eventing.trigger('form.change');
    }

    goToNextFinancePeriod = () => {
        if (this.waitForBeingActiveData && this.waitForBeingActiveData.financialPeriods && this.waitForBeingActiveData.financialPeriods.length) {
            const lengths = this.waitForBeingActiveData.financialPeriods.length - 1;
            const focusIndex = this.waitForBeingActiveData.financialPeriods.findIndex(i => i === this.waitForBeingActiveFinancialPeriod);
            if (focusIndex > -1 && focusIndex + 1 <= lengths) {
                this.waitForBeingActiveFinancialPeriod = this.waitForBeingActiveData.financialPeriods[focusIndex + 1];
            } else {
                this.waitForBeingActiveFinancialPeriod = this.waitForBeingActiveData.financialPeriods[0];
            }
            this.pageData.Eventing.trigger('form.change');
        }
    }

    goToPreviousPeriod = () => {
        if (this.waitForBeingActiveData && this.waitForBeingActiveData.financialPeriods && this.waitForBeingActiveData.financialPeriods.length) {
            const lengths = this.waitForBeingActiveData.financialPeriods.length - 1;
            const focusIndex = this.waitForBeingActiveData.financialPeriods.findIndex(i => i === this.waitForBeingActiveFinancialPeriod);
            if (focusIndex && focusIndex > 0) {
                this.waitForBeingActiveFinancialPeriod = this.waitForBeingActiveData.financialPeriods[focusIndex - 1];
            } else {
                this.waitForBeingActiveFinancialPeriod = this.waitForBeingActiveData.financialPeriods[lengths];
            }
            this.pageData.Eventing.trigger('form.change');
        }
    }

    public initializeListenersInSelectMode?: boolean = undefined;
    public datas: Data[] = [];
    public activeData?: Data;
    public waitForBeingActiveData?: Data;
    public waitForBeingActiveFinancialPeriod?: FinancialPeriod;
    public activeFinancialPeriod?: FinancialPeriod;
    public pageData: BasePageData = new TabPageData(this.mainStateManager);
    public initializeStatusBar: boolean = false;

    constructor(
        public mainStateManager: MainStateManager
    ) { }

    deserialize = (json: IData[]) => {
        if (json && json.length) {
            let isAnyActive = false;
            this.datas = json.map((data, index) => {
                const newData = new Data(this.mainStateManager, data.id, data.isActive, data.name, data.caption, data.owner);

                newData.financialPeriods = FinancialPeriod.deserialize(data.financialPeriods);

                if (newData.isActive) {
                    isAnyActive = true;
                    this.activeData = newData;
                }

                if (!isAnyActive && index === json.length - 1) {
                    newData.isActive = true;
                    this.activeData = newData;
                }

                if (this.activeData) {
                    this.activeFinancialPeriod = this.activeData.financialPeriods.find(financialPeriod => financialPeriod.isActive);
                }

                return newData;
            });
        }
    }
}