/src/main.js
import PixelEditor from './PixelEditor';
import Palette from './Palette';
import Toolbox from './Toolbox';
import { TOOL_PEN, TOOL_FILL, TOOL_LINE } from './Toolbox';

var appState = {};

function saveFail() {
    let saveFailDialog = document.getElementById('dialog-save-fail');
    let saveFailImage = document.getElementById('save-fail-image');
    let saveFailClose = document.getElementById('save-fail-close');

    saveFailClose.onclick = function() {
        saveFailDialog.style.display = 'none';
    }

    try {
        saveFailImage.src = appState.pixelEditor.preview.toDataURL();
        saveFailDialog.style.display = null;
    } catch(e) {
        console.log("toDataURL failed", e);
        alert("Sorry, I can't save. Try right clicking and saving the preview?");
    }
}

window.savePNG = function save() {
    let saver = document.getElementById('saver');
    appState.pixelEditor.getFile().then(file => {
        let uri = URL.createObjectURL(file);
        saver.src = uri;
        URL.revokeObjectURL(uri);
    }).catch(e => {
        if (e.message == "Object doesn't support property or method 'toBlob'" || e.message.search(/toBlob is not a function/)) {
            saveFail();
        } else {
            alert("unknown error");
            saveFail();
            console.log(e);
        }
    });
}

window.loadFile = function loadFile() {
    let loader = document.getElementById('loader');
    loader.onchange = function() {
        let url = URL.createObjectURL(loader.files[0]);
        let img = document.createElement('img');
        img.src = url;
        img.onload = function() {
            URL.revokeObjectURL(url);
            appState.pixelEditor.loadFromImage(img);
        };
        img.onerror = function() {
            URL.revokeObjectURL(url);
            alert("This doesn't appear to be an image");
        };
    };
    loader.click();
}

window.undo = function() {
    appState.pixelEditor.popState();
    appState.pixelEditor.redraw();
    appState.pixelEditor.refresh();
}

window.nextPalette = function() {
    appState.palette.nextPalette();
    appState.pixelEditor.paletteChanged();
}

window.prevPalette = function() {
    appState.palette.prevPalette();
    appState.pixelEditor.paletteChanged();
}

window.toggleGrid = function() {
    appState.pixelEditor.toggleGrid();
}

window.showSizes = function() {
    document.getElementById('dialog-select-size').style.display = null;
    document.getElementById('select-size-cancel').onclick = () => {
        document.getElementById('dialog-select-size').style.display = 'none';
    };
}

window.selectSize = function(n) {
    appState.pixelEditor.setSize(n, n);
    appState.pixelEditor.refresh();
    document.getElementById('dialog-select-size').style.display = 'none';
}

window.selectTool = function(t) {
    appState.toolbox.selectTool(t);
}

window.addEventListener('load', event => {
    appState.palette = new Palette(appState);
    appState.toolbox = new Toolbox(appState);
    appState.pixelEditor = new PixelEditor(appState);
});