import { ElementsOfFormFactory } from "..";
import { ElementTabbing, IFocusAbleElementFactory } from "./ElementTabbing";
import { GridEditTabbing } from "./GridEditTabbing";
import { ToolboxTabbing } from "./ToolTipTabbing";



export class Tabbing {
    public toolBoxTabIndex: number = -1;
    private _activeElementIndex: number = 0;
    public get activeElementIndex() {
        return this._activeElementIndex;
    }
    public set activeElementIndex(value: number) {
        this._activeElementIndex = value;
    }

    public elementTabbing: ElementTabbing;
    public toolboxTabbing: ToolboxTabbing;
    public gridEditTabbing: GridEditTabbing;
    constructor(
        public elementsOfFormFactory: ElementsOfFormFactory
    ) {
        this.elementTabbing = new ElementTabbing(this);
        this.toolboxTabbing = new ToolboxTabbing(this);
        this.gridEditTabbing = new GridEditTabbing(this);
    }

    userClickOnElement = (element: EventTarget) => {
        const focusAbleElement = this.elementTabbing.isThereAnyElement(element);
        if (focusAbleElement && typeof focusAbleElement.tabIndex === 'number' && focusAbleElement.element) {
            this.elementTabbing.setFocus(focusAbleElement);
        } else {
            this.elementTabbing.focusToZeroTabIndexOrFirstElementOrToolbox();
        }

    }


    ///it lock at active element index and try to give it focus
    public focus = () => {
        if (this.toolboxTabbing.isEmpty() && this.elementTabbing.isEmpty()) {
            this.elementsOfFormFactory.mainStateManager.authFactory.searchBoxRef?.current?.focus();
            return;
        }

        if (this.activeElementIndex === -1) {
            this.toolboxTabbing.focus(true);
        } else if (this.gridEditTabbing.isGridActiveControl()) {
            this.gridEditTabbing.focus();
        } else {
            this.elementTabbing.focus();
        }
    }

    // public focusElementOfForm: {
    //     (tabIndex: number): void;
    //     (element: IFocusAbleElementFactory): void;
    //     (element: HTMLElement): void;
    // } = (param: IFocusAbleElementFactory | number | HTMLElement) => {
    //     if (typeof param === 'number') {
    //         this.elementTabbing.focusToElementByTabIndex(param);
    //     } else if (typeof param === 'object') {
    //         if ('element' in param) {
    //             this.elementTabbing.focusToElementByFactory(param);
    //         } else {
    //             this.elementTabbing.focusToElementByHTMLElement(param);
    //         }
    //     }
    // }

}