import GraphicSet from "../../../js/GraphicSet.js";
import Setting from "../../../js/Setting.js";
import TilorswiftTilesetSelectedEvent from "../events/TilorswiftTilesetSelectedEvent.js";
import {Checkbox} from "./elements/Checkbox.js";

export default class Dialog
{
    constructor()
    {
        this.htmlElement = document.createElement('div');
        this.htmlElement.classList.add('dialog');
        this.boxElement = document.createElement('div');
        this.boxElement.classList.add('dialog-box');
        this.htmlElement.appendChild(this.boxElement);
        this.messageElement = document.createElement('div');
        this.messageElement.classList.add('dialog-message');
        this.boxElement.appendChild(this.messageElement);
        this.inputAreaElement = document.createElement('div');
        this.inputAreaElement.classList.add('dialog-input-area');
        this.boxElement.appendChild(this.inputAreaElement);
        this.buttonAreaElement = document.createElement('div');
        this.buttonAreaElement.classList.add('dialog-button-area');
        this.boxElement.appendChild(this.buttonAreaElement);

        document.body.appendChild(this.htmlElement);
    }

    createButton(text)
    {
        let button = document.createElement('span');
        button.classList.add('dialog-button');
        button.innerText = text;
        this.buttonAreaElement.appendChild(button);

        button.addEventListener(
            'click',
            () => {
                this.htmlElement.remove();
            }
        );

        return button;
    }

    createInputNumber(label, value = 0, min = 0, max = 999999, step = 1)
    {
        let htmlElement = document.createElement('div');
        htmlElement.classList.add('dialog-input-area');

        let htmlElementLabel = document.createElement('div');
        htmlElementLabel.classList.add('dialog-label');
        htmlElementLabel.innerText = label;

        let htmlElementInput = document.createElement('input');
        htmlElementInput.classList.add('dialog-input');
        htmlElementInput.type = 'number';
        htmlElementInput.value = value;
        htmlElementInput.max = max;
        htmlElementInput.min = min;
        htmlElementInput.step = step;

        htmlElement.appendChild(htmlElementLabel);
        htmlElement.appendChild(htmlElementInput);

        this.inputAreaElement.appendChild(htmlElement);

        return htmlElementInput;
    }

    createCheckbox(label, value, isChecked = false, onClick = () => {})
    {
	const checkbox = new Checkbox(label, value, isChecked);
	checkbox.onClick = onClick;

	this.inputAreaElement.appendChild(checkbox.htmlElement);

	return checkbox;
    }

    createTilesetSelector()
    {
        let htmlElement = document.createElement('div');
        htmlElement.id = 'tileset-selector';

        let htmlElementLabel = document.createElement('div');
        htmlElementLabel.classList.add('dialog-label');
        htmlElementLabel.innerText = 'Terrain';

        let htmlAvatarElement = document.createElement('div');
        htmlAvatarElement.id = 'tileset-avatar';
        htmlAvatarElement.style.backgroundImage = 'url("../' + Setting.TILESET_LOCATION + GraphicSet[0].tileset + '")';

        let htmlListElement = document.createElement('div');
        htmlListElement.id = 'tileset-list';

        htmlElement.appendChild(htmlElementLabel);
        htmlElement.appendChild(htmlAvatarElement);
        htmlElement.appendChild(htmlListElement);

        htmlAvatarElement.addEventListener(
            'click',
            () => {
                htmlListElement.style.display = 'block';
            }
        );

        GraphicSet.forEach(
            (graphicSet, index) => {
                let htmlTilesetElement = document.createElement('div');
                htmlTilesetElement.classList.add('tileset');

                let htmlThumbnail = document.createElement('div');
                htmlThumbnail.classList.add('tileset-thumbnail');

                const image = new Image();
                image.src = '../' + Setting.TILESET_LOCATION + graphicSet.tileset;

                htmlThumbnail.style.backgroundImage = 'url(' + image.src + ')';
                htmlThumbnail.style.backgroundPositionX = -(image.width / graphicSet.tiles) * graphicSet.tilePreview + 'px';
                htmlTilesetElement.appendChild(htmlThumbnail);

                let htmlTitleElement = document.createElement('div');
                htmlTitleElement.classList.add('tileset-title');
                htmlTitleElement.innerText = graphicSet.name;
                htmlTilesetElement.appendChild(htmlTitleElement);

                htmlTilesetElement.addEventListener(
                    'click',
                    () => {
                        htmlListElement.style.display = 'none';
                        htmlAvatarElement.style.backgroundImage = 'url(' + image.src + ')';
                        htmlAvatarElement.style.backgroundPositionX = -96 * graphicSet.tilePreview + 'px';

                        window.dispatchEvent(new TilorswiftTilesetSelectedEvent(index));
                    }
                );

                htmlListElement.appendChild(htmlTilesetElement);
            }
        );

        this.inputAreaElement.appendChild(htmlElement);

        return htmlElement;
    }



    createFileInput(types = [])
    {
        let input = document.createElement('input');
        input.type = 'file';

        if (types.length > 0) {
            for (const t in types) {
                types[t] = '.' + types[t]
            }

            input.accept = types.join(', ');
        }

        this.inputAreaElement.appendChild(input);

        return input;
    }

    setMessage(message)
    {
        this.messageElement.innerText = message;
    }

    close()
    {
        this.htmlElement.remove();
    }
}
