const MszShowConfirmBox = async (text, title, target) => {
    let result = false;

    await MszShowMessageBox(text, title, [
        { text: 'Yes', callback: async () => result = true },
        { text: 'No' },
    ], target);

    return result;
};

const MszShowMessageBox = (text, title, buttons, target) => {
    if(typeof text !== 'string') {
        if(text !== undefined && text !== null && typeof text.toString === 'function')
            text = text.toString();
        else throw 'text must be a string';
    }
    if(!(target instanceof Element))
        target = document.body;

    if(typeof title !== 'string')
        title = 'Information';
    if(!Array.isArray(buttons))
        buttons = [];

    return new Promise((resolve, reject) => {
        if(target.querySelector('.messagebox')) {
            reject();
            return;
        }

        let buttonsElem;
        const html = <div class="messagebox">
            <div class="container messagebox__container">
                <div class="container__title">
                    <div class="container__title__background"/>
                    <div class="container__title__text">{title}</div>
                </div>
                <div class="container__content">{text}</div>
                {buttonsElem = <div class="messagebox__buttons"/>}
            </div>
        </div>;

        let firstButton;
        if(buttons.length < 1) {
            firstButton = <button class="input__button" onclick={() => {
                html.remove();
                resolve();
            }}>OK</button>;
            buttonsElem.appendChild(firstButton);
        } else {
            for(const button of buttons) {
                const buttonElem = <button class="input__button" onclick={() => {
                    html.remove();

                    if(typeof button.callback === 'function')
                        button.callback().finally(() => resolve());
                    else
                        resolve();
                }}>{button.text}</button>;
                buttonsElem.appendChild(buttonElem);

                if(firstButton === undefined)
                    firstButton = buttonElem;
            }
        }

        target.appendChild(html);
        firstButton.focus();
    });
};