import init, {
    add_tiles,
    load_image,
    load_game,
    load_default_game,
    output,
    set_prefix,
    set_invert,
    set_flip,
    set_mirror,
    set_rotate
} from './pkg/tilesy.js';

if (typeof WebAssembly !== "object") {
    document.getElementById("start").innerText = "Sorry - your browser does not support WebAssembly";
}

// stolen from https://ourcodeworld.com/articles/read/189/how-to-create-a-file-and-generate-a-download-with-javascript-in-the-browser-without-a-server
function download(filename, text) {
    let element = document.createElement('a');

    element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));
    element.setAttribute('download', filename);
    element.style.display = 'none';
    document.body.appendChild(element);
    element.click();
    document.body.removeChild(element);
}

function el(id) {
    return document.getElementById(id);
}

function pagination(e) {
    const parent = e.target.parentNode;

    parent.style.display = "none";

    if (e.target.classList.contains("next")) {
        parent.nextSibling.style.display = "block";
    } else if (e.target.classList.contains("prev")) {
        parent.previousSibling.style.display = "block";
    } else if (e.target.classList.contains("start")) {
        document.getElementById("start").style.display = "block";
    }
}

function readFile(input, callback, type = "text") {
    if (input.files && input.files[0]) {
        let reader = new FileReader();
        reader.onload = callback;

        if (type === "text") {
            reader.readAsText(input.files[0]);
        } else {
            reader.readAsDataURL(input.files[0]);
        }
    }
}

async function run() {
    await init();

    const buttonAddImage         = el("add");
    const buttonBackToImage      = el("back-to-image");
    const buttonDownload         = el("download");
    const buttonGameDataProceed  = el("game-data-next");
    const buttonImportGame       = el("import");
    const buttonLoadGame         = el("load");
    const buttonNewGame          = el("new");
    const buttonReset            = el("reset");
    const checkboxInvertTiles    = el("invert");
    const checkboxFlipTiles      = el("flip");
    const checkboxMirrorTiles    = el("mirror");
    const checkboxRotateTiles    = el("rotate");
    const inputPrefix            = el("prefix");
    const imagePreview           = el("preview");
    const textareaGameDataInput  = el("game-data");
    const textareaGameDataOutput = el("output");

    // hide all pages except start page
    for (let page of document.getElementsByClassName('page')) {
        page.style.display = "none";
    }
    el("start").style.display = "block";

    for (let pageButton of document.getElementsByClassName("pagination")) {
        pageButton.addEventListener('click',    pagination);
        pageButton.addEventListener('touchend', pagination);
    }

    function new_game() {
        load_default_game();
        textareaGameDataInput.value = output();
        checkGameData();
        // we don't need to look at the default game data, so skip ahead to the image page
        buttonGameDataProceed.click();
    }

    function clear_game() {
        textareaGameDataInput.value = "";
        checkGameData();
    }

    buttonNewGame.addEventListener("click", new_game);
    buttonNewGame.addEventListener("touchend", new_game);
    buttonLoadGame.addEventListener("click", clear_game);
    buttonLoadGame.addEventListener("touchend", clear_game);

    // handle game data and image

    el("game").addEventListener("change", function() {
        readFile(this, function (e) {
            textareaGameDataInput.value = e.target.result;
            console.log(load_game(e.target.result));
            checkGameData();
        }, "text");
    });

    function checkGameData() {
        if (textareaGameDataInput.value.length > 0) {
            buttonGameDataProceed.removeAttribute("disabled");
        } else {
            buttonGameDataProceed.setAttribute("disabled", "disabled");
        }
    }

    textareaGameDataInput.addEventListener("change", checkGameData);
    textareaGameDataInput.addEventListener("keyup",  checkGameData);
    checkGameData();

    imagePreview.style.display = "none";

    el('image').addEventListener('change', function () {
        readFile(this, function (e) {
            imagePreview.src = e.target.result;
            imagePreview.style.display = "initial";
            console.log(load_image(imagePreview.getAttribute("src")));
        }, "image");
    });

    function addTiles() {
        console.log(add_tiles());
        textareaGameDataOutput.value = output();
    }

    buttonImportGame.addEventListener("click",    addTiles);
    buttonImportGame.addEventListener("touchend", addTiles);

    function handleDownload() {
        download("output.bitsy", textareaGameDataOutput.value);
    }

    buttonDownload.addEventListener("click",    handleDownload);
    buttonDownload.addEventListener("touchend", handleDownload);

    function addImage() {
        textareaGameDataInput.value = textareaGameDataOutput.value;
        textareaGameDataOutput.value = "";
        buttonBackToImage.click();
    }

    buttonAddImage.addEventListener("click",    addImage);
    buttonAddImage.addEventListener("touchend", addImage);

    inputPrefix.addEventListener("change", () => {
        set_prefix(inputPrefix.value);
    })

    checkboxInvertTiles.addEventListener("change", () => {
       set_invert(checkboxInvertTiles.checked);
    });

    checkboxFlipTiles.addEventListener("change", () => {
        set_flip(checkboxFlipTiles.checked);
    });

    checkboxMirrorTiles.addEventListener("change", () => {
        set_mirror(checkboxMirrorTiles.checked);
    });

    checkboxRotateTiles.addEventListener("change", () => {
        set_rotate(checkboxRotateTiles.checked);
    });

    function reset() {
        clear_game();
        imagePreview.removeAttribute("src");
    }

    buttonReset.addEventListener("click",    reset);
    buttonReset.addEventListener("touchend", reset);
}

run();