/**
 * Generic Yes-No Pop-up box
 * Used to create pop-up boxes that require a yes/no response from player
 *
 * There are two types of pop ups:
 *  1. Just a Yes/No response from player
 *  2. Popup also includes a text input field in addition to the Yes/No response
 */
import { clearEventListeners } from "./uiHelpers/clearEventListeners";
import { KEY } from "./helpers/keyCodes";
import * as ReactDOM from "react-dom";

export let yesNoBoxOpen = false;

const yesNoBoxContainer: HTMLElement | null = document.getElementById("yes-no-box-container");
const yesNoBoxTextElement: HTMLElement | null = document.getElementById("yes-no-box-text");

function yesNoBoxHotkeyHandler(e: KeyboardEvent): void {
    if (e.keyCode === KEY.ESC) {
        yesNoBoxClose();
    } else if (e.keyCode === KEY.ENTER) {
        const yesBtn: HTMLElement | null = document.getElementById("yes-no-box-yes");
        if (yesBtn) {
            yesBtn.click();
        } else {
            console.error(`Could not find YesNoBox Yes button DOM element`)
        }
    }
}

export function yesNoBoxClose(): boolean {
    if (yesNoBoxContainer) {
        yesNoBoxContainer.style.display = "none";
    } else {
        console.error("Container not found for YesNoBox");
    }
    yesNoBoxOpen = false;

    // Remove hotkey handler
    document.removeEventListener("keydown", yesNoBoxHotkeyHandler);

    return false; //So that 'return yesNoBoxClose()' is return false in event listeners
}

export function yesNoBoxGetYesButton(): HTMLElement | null {
    return clearEventListeners("yes-no-box-yes");
}

export function yesNoBoxGetNoButton(): HTMLElement | null {
    return clearEventListeners("yes-no-box-no");
}

export function yesNoBoxCreate(txt: string | JSX.Element): boolean {
    if (yesNoBoxOpen) { return false; }   //Already open
    yesNoBoxOpen = true;

    if (yesNoBoxTextElement) {
        ReactDOM.unmountComponentAtNode(yesNoBoxTextElement);
        yesNoBoxTextElement.innerHTML = '';
        if(typeof txt === 'string') {
            yesNoBoxTextElement.innerHTML = txt as string;
        } else {
            ReactDOM.render(txt, yesNoBoxTextElement);
        }
    } else {
        console.error(`Text element not found for YesNoBox`);
    }

    if (yesNoBoxContainer) {
        yesNoBoxContainer.style.display = "flex";
    } else {
        console.error("Container not found for YesNoBox");
    }

    // Add event listener for Esc and Enter hotkeys
    document.addEventListener("keydown", yesNoBoxHotkeyHandler);

    return true;
}

/**
 * Yes-No pop up box with text input field
 */
const yesNoTextInputBoxContainer: HTMLElement | null = document.getElementById("yes-no-text-input-box-container");
const yesNoTextInputBoxInput: HTMLInputElement | null = document.getElementById("yes-no-text-input-box-input") as HTMLInputElement;
const yesNoTextInputBoxTextElement: HTMLElement | null = document.getElementById("yes-no-text-input-box-text");

export function yesNoTxtInpBoxHotkeyHandler(e: KeyboardEvent): void {
    if (e.keyCode === KEY.ESC) {
        yesNoTxtInpBoxClose();
    } else if (e.keyCode === KEY.ENTER) {
        const yesBtn: HTMLElement | null = document.getElementById("yes-no-text-input-box-yes");
        if (yesBtn) {
            yesBtn.click();
        } else {
            console.error(`Could not find YesNoTxtInputBox Yes button DOM element`)
        }
    }
}

export function yesNoTxtInpBoxClose(): boolean {
    if (yesNoTextInputBoxContainer != null) {
        yesNoTextInputBoxContainer.style.display = "none";
    } else {
        console.error("Container not found for YesNoTextInputBox");
        return false;
    }
    if(!yesNoTextInputBoxInput) throw new Error("yesNoTextInputBoxInput was not set");
    yesNoBoxOpen = false;
    yesNoTextInputBoxInput.value = "";

    // Remove hotkey handler
    document.removeEventListener("keydown", yesNoTxtInpBoxHotkeyHandler);

    return false;
}

export function yesNoTxtInpBoxGetYesButton(): HTMLElement {
    const elem = clearEventListeners("yes-no-text-input-box-yes");
    if(elem === null) throw new Error("Could not find element with id: 'yes-no-text-input-box-yes'");
    return elem;
}

export function yesNoTxtInpBoxGetNoButton(): HTMLElement {
    const elem = clearEventListeners("yes-no-text-input-box-no");
    if(elem === null) throw new Error("Could not find element with id: 'yes-no-text-input-box-no'");
    return elem;
}

export function yesNoTxtInpBoxGetInput(): string {
    if (!yesNoTextInputBoxInput) {
        console.error("Could not find YesNoTextInputBox input element");
        return "";
    }
    let val: string = yesNoTextInputBoxInput.value;
    val = val.replace(/\s+/g, '');
    return val;
}

export function yesNoTxtInpBoxCreate(txt: string | JSX.Element): void {
    yesNoBoxOpen = true;


    if (yesNoTextInputBoxTextElement) {
        ReactDOM.unmountComponentAtNode(yesNoTextInputBoxTextElement);
        yesNoTextInputBoxTextElement.innerHTML = '';
        if(typeof txt === 'string') {
            yesNoTextInputBoxTextElement.innerHTML = txt;
        } else {
            ReactDOM.render(txt, yesNoTextInputBoxTextElement);
        }
    }

    if (yesNoTextInputBoxContainer) {
        yesNoTextInputBoxContainer.style.display = "flex";
    } else {
        console.error("Container not found for YesNoTextInputBox");
    }

    // Add event listener for Esc and Enter hotkeys
    document.addEventListener("keydown", yesNoTxtInpBoxHotkeyHandler);

    if(!yesNoTextInputBoxInput) throw new Error("yesNoTextInputBoxInput was not set");
    yesNoTextInputBoxInput.focus();
}