export default class InputHelper {
    private title: string;
    private value: string;
    private created: boolean;
    private browser: BrowserMp;
    private data: GlobalData;

    constructor(title: string, globalData: GlobalData) {
        this.title = title;
        this.data = globalData;

        this.cefTitleCall = this.cefTitleCall.bind(this);
        mp.events.add('cef_request_title', this.cefTitleCall);

        this.cefCallback = this.cefCallback.bind(this);
        mp.events.add('cef_inputhelper_sendvalue', this.cefCallback);

        this.finish = this.finish.bind(this);
        this.show = this.show.bind(this);
        this.valueGetter = this.valueGetter.bind(this);
        this.getValue = this.getValue.bind(this);

        this.value = undefined;

        mp.events.add('render', this.disableControls);
    }

    private disableControls() {
        for (var i = 0; i <= 33; i++) {
            mp.game.controls.disableAllControlActions(i);
        }
    }

    show() {
        if (this.created) return;
        this.data.InInput = true;
        this.created = true;
        this.browser = mp.browsers.new('package://assets/html/inputhelper/index.html');
    }

    private finish() {
        if (this.browser) {
            mp.events.remove('cef_inputhelper_sendvalue');
            mp.events.remove('cef_request_title');
            mp.events.remove('render', this.disableControls);
            this.browser.destroy();
            this.data.InInput = false;
            this.created = false;
        }
    }

    private cefTitleCall() {
        this.browser.execute(`setTitle('${this.title}')`);
    }

    private cefCallback(val) {
        this.value = val;
        this.finish();
    }

    private valueGetter(): Promise<string> {
        return new Promise(resolve => {
            setInterval(() => {
                if (this.value !== undefined) resolve(this.value);
            }, 50);
        });
    }

    async getValue(callback: Function) {
        var getVal = await this.valueGetter();
        callback(getVal);
    }
}

exports = InputHelper;