import * as MODULE from "../MaterialDeck.js";
import {streamDeck} from "../MaterialDeck.js";

export class OtherControls{
    constructor(){
        this.active = false;
        this.offset = 0;
    }

    async updateAll(){
        if (this.active == false) return;
        for (let i=0; i<32; i++){   
            let data = streamDeck.buttonContext[i];
            if (data == undefined || data.action != 'other') continue;
            await this.update(data.settings,data.context);
        }
    }

    update(settings,context){
        this.active = true;
        let mode = settings.otherMode;
        if (mode == undefined) mode = 0;

        if (mode == 0) {    //pause
            this.updatePause(settings.pauseFunction,context);
        }
        else if (mode == 1) {   //scene selection
            this.updateScene(settings,context);
        }
        else if (mode == 2){    //control buttons
            this.updateControl(settings,context);
        }
        else if (mode == 3){    //darkness
            this.updateDarkness(settings,context);
        }
        else if (mode == 4){    //roll tables
            this.updateRollTable(settings,context);
        }
        else if (mode == 5) {   //open sidebar tab
            this.updateSidebar(settings,context);
        }
        else if (mode == 6) {   //open compendium
            this.updateCompendium(settings,context);
        }
        else if (mode == 7) {   //open journal
            this.updateJournal(settings,context);
        }
    }

    keyPress(settings){
        let mode = settings.otherMode;
        if (mode == undefined) mode = 0;

        if (mode == 0) {    //pause
            this.keyPressPause(settings.pauseFunction);
        }
        else if (mode == 1) {   //scene
            this.keyPressScene(settings);
        }
        else if (mode == 2) {   //control buttons
            this.keyPressControl(settings);
        }
        else if (mode == 3) {   //darkness controll
            this.keyPressDarkness(settings);
        }
        else if (mode == 4) {   //roll tables
            this.keyPressRollTable(settings);
        }
        else if (mode == 5) {   //sidebar
            this.keyPressSidebar(settings);
        }
        else if (mode == 6) {   //open compendium
            this.keyPressCompendium(settings);
        }
        else if (mode == 7) {   //open journal
            this.keyPressJournal(settings);
        }
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////

    updatePause(pauseFunction,context){
        let src = "";
        if (pauseFunction == undefined) pauseFunction = 0;
        
        let background = settings.background;
        if(background == undefined) background = '#000000';

        let ringColor = "#000000";

        let ringOffColor = settings.offRing;
        if (ringOffColor == undefined) ringOffColor = '#000000';

        let ringOnColor = settings.onRing;
        if (ringOnColor == undefined) ringOnColor = '#00FF00';

        let playlistType = settings.playlistType;
        if (playlistType == undefined) playlistType = 0;

        if (pauseFunction == 0){ //Pause game
            if (game.paused) ringColor = ringOnColor;
            else ringColor = ringOffColor;
            src = 'action/images/other/pause/pause.png';
        }
        else if (pauseFunction == 1){ //Resume game
            if (game.paused == false) ringColor = ringOnColor;
            else ringColor = ringOffColor;
            src = 'action/images/other/pause/resume.png';
        }
        else if (pauseFunction == 2) { //toggle
            if (game.paused == false) ringColor = ringOnColor;
            else ringColor = ringOffColor;
            src = 'action/images/other/pause/playpause.png';
        }
        streamDeck.setIcon(0,context,src,background,2,ringColor);
    }

    keyPressPause(pauseFunction){
        if (pauseFunction == undefined) pauseFunction = 0;
        if (pauseFunction == 0){ //Pause game
            if (game.paused) return; 
            game.togglePause();
        }
        else if (pauseFunction == 1){ //Resume game
            if (game.paused == false) return; 
            game.togglePause();
        }
        else if (pauseFunction == 2) { //toggle
            game.togglePause();
        }
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////

    updateScene(settings,context){
        if (canvas.scene == null) return;
        let func = settings.sceneFunction;
        if (func == undefined) func = 0;

        let background = settings.background;
        if(background == undefined) background = '#000000';

        let ringColor = "#000000";

        let ringOffColor = settings.offRing;
        if (ringOffColor == undefined) ringOffColor = '#000000';

        let ringOnColor = settings.onRing;
        if (ringOnColor == undefined) ringOnColor = '#00FF00';

        let playlistType = settings.playlistType;
        if (playlistType == undefined) playlistType = 0;

        let src = "";
        let name = "";
        if (func == 0){ //visible scenes
            let nr = parseInt(settings.sceneNr);
            if (isNaN(nr)) nr = 1;
            nr--;

            let scene = game.scenes.apps[0].scenes[nr];
            
            if (scene != undefined){
                if (scene.isView) 
                    ringColor = ringOnColor;
                else 
                    ringColor = ringOffColor;
                if (settings.displaySceneName) name = scene.name;
                if (settings.displaySceneIcon) src = scene.img;
                if (scene.active) name += "\n(Active)";
            }
        }
        else if (func == 1) {   //all scenes
            let scene = game.scenes.apps[1].entities.find(p=>p.data.name == name);
            if (scene != undefined){
                if (scene.isView)
                    ringColor = ringOnColor;
                else 
                    ringColor = ringOffColor;
                if (settings.displaySceneName) name = scene.name;
                if (settings.displaySceneIcon) src = scene.img;
                if (scene.active) name += "\n(Active)";
            }
        }
        streamDeck.setTitle(name,context);
        streamDeck.setIcon(1, context,src,background,2,ringColor);
    }

    keyPressScene(settings){
        let func = settings.sceneFunction;
        if (func == undefined) func = 0;
        if (func == 0){ //visible scenes
            let viewFunc = settings.sceneViewFunction;
            if (viewFunc == undefined) viewFunc = 0;

            let nr = parseInt(settings.sceneNr);
            if (isNaN(nr)) nr = 1;
            nr--;
            let scene = game.scenes.apps[0].scenes[nr];
            
            if (scene != undefined){
                if (viewFunc == 0){
                    scene.view();
                }
                else if (viewFunc == 1){
                    scene.activate();
                }
                else {
                    if (scene.isView) scene.activate();
                    scene.view();
                }
            }  
        }
    }

    //////////////////////////////////////////////////////////////////////////////////////////
    
    updateControl(settings,context){
        let control = settings.control;
        if (control == undefined) control = 0;

        let tool = settings.tool;
        if (tool == undefined) tool = 0;

        let background = settings.background;
        if (background == undefined) background = '#000000';

        let ringColor = '#000000'

        const controlName = this.getControlName(control);
        const toolName = this.getToolName(control,tool);

        let txt = "";
        let src = "";
        const activeControl = ui.controls.activeControl;
        const activeTool = ui.controls.activeTool;

        if (control == 0) { //displayed controls
            let controlNr = parseInt(settings.controlNr);
            if (isNaN(controlNr)) controlNr = 1;
            controlNr--;

            const selectedControl = ui.controls.controls[controlNr];
            if (selectedControl != undefined){
                if (tool == 0){  //open category
                    txt = game.i18n.localize(selectedControl.title);
                    src = selectedControl.icon;
                    if (activeControl == selectedControl.name)
                        ringColor = "#FF7B00";
                }
            }
        }
        else if (control == 1){  //displayed tools
            let controlNr = parseInt(settings.controlNr);
            if (isNaN(controlNr)) controlNr = 1;
            controlNr--;

            const selectedControl = ui.controls.controls.find(c => c.name == ui.controls.activeControl);
            if (selectedControl != undefined){
                const selectedTool = selectedControl.tools[controlNr];
                if (selectedTool != undefined){
                    txt = game.i18n.localize(selectedTool.title);
                    src = selectedTool.icon;
                    if (selectedTool.toggle){
                        background = "#340057"
                        if (selectedTool.active)
                            ringColor = "#A600FF"
                        else    
                            ringColor = "#340057";
                    }
                    else if (activeTool == selectedTool.name)
                        ringColor = "#FF7B00";
                }  
            }
        }
        else {  // specific control/tool
            const selectedControl = ui.controls.controls.find(c => c.name == controlName);
            if (selectedControl != undefined){
                if (tool == 0){  //open category
                        txt = game.i18n.localize(selectedControl.title);
                        src = selectedControl.icon;
                        if (activeControl == selectedControl.name)
                            ringColor = "#FF7B00";
                }
                else {
                    const selectedTool = selectedControl.tools.find(t => t.name == toolName);
                    if (selectedTool != undefined){
                        txt = game.i18n.localize(selectedTool.title);
                        src = selectedTool.icon;
                        if (selectedTool.toggle){
                            background = "#340057"
                            if (selectedTool.active)
                                ringColor = "#A600FF"
                            else    
                                ringColor = "#340057"
                        }
                        else if (activeTool == selectedTool.name && activeControl == selectedControl.name)
                            ringColor = "#FF7B00";
                    }
                }
            }
        }
        streamDeck.setIcon(1,context,src,background,2,ringColor);
        streamDeck.setTitle(txt,context);
    }

    keyPressControl(settings){
        if (canvas.scene == null) return;
        let control = settings.control;
        if (control == undefined) control = 0;

        let tool = settings.tool;
        if (tool == undefined) tool = 0;

        const controlName = this.getControlName(control);
        const toolName = this.getToolName(control,tool);
        
        if (control == 0){  //displayed controls
            let controlNr = parseInt(settings.controlNr);
            if (isNaN(controlNr)) controlNr = 1;
            controlNr--;
            const selectedControl = ui.controls.controls[controlNr];
            if (selectedControl != undefined){
                ui.controls.activeControl = controlName;
                selectedControl.activeTool = selectedControl.activeTool;
                canvas.getLayer(selectedControl.layer).activate();
            }
        }
        else if (control == 1){  //displayed tools
            let controlNr = parseInt(settings.controlNr);
            if (isNaN(controlNr)) controlNr = 1;
            controlNr--;
            const selectedControl = ui.controls.controls.find(c => c.name == ui.controls.activeControl);
            if (selectedControl != undefined){
                const selectedTool = selectedControl.tools[controlNr];
                if (selectedTool != undefined){
                    if (selectedTool.toggle) {
                        selectedTool.active = !selectedTool.active;
                        selectedTool.onClick(selectedTool.active);
                    }
                    else if (selectedTool.button){
                        selectedTool.onClick();
                    }
                    else
                        selectedControl.activeTool = selectedTool.name;
                }  
            }
        }
        else {  //select control
            const selectedControl = ui.controls.controls.find(c => c.name == controlName);
            if (selectedControl != undefined){
                if (tool == 0){  //open category
                    ui.controls.activeControl = controlName;
                    selectedControl.activeTool = selectedControl.activeTool;
                    canvas.getLayer(selectedControl.layer).activate();
                }
                else {
                    const selectedTool = selectedControl.tools.find(t => t.name == toolName);
                    if (selectedTool != undefined){
                        ui.controls.activeControl = controlName;
                        canvas.getLayer(selectedControl.layer).activate();
                        if (selectedTool.toggle) {
                            selectedTool.active = !selectedTool.active;
                            selectedTool.onClick(selectedTool.active);
                        }
                        else if (selectedTool.button){
                            selectedTool.onClick();
                        }
                        else
                            selectedControl.activeTool = toolName;
                    }
                }
            }
        } 
        ui.controls.render(); 
    }

    getControlName(control){
        control -= 2;
        let name;
        if (control == 0) name = 'token';
        else if (control == 1) name = 'measure';
        else if (control == 2) name = 'tiles';
        else if (control == 3) name = 'drawings';
        else if (control == 4) name = 'walls';
        else if (control == 5) name = 'lighting';
        else if (control == 6) name = 'sounds';
        else if (control == 7) name = 'notes';
        return name;
    }

    getToolName(control,tool){
        control -= 2;
        tool--;
        let name;
        if (control == 0){  //basic controls
            if (tool == 0) name = 'select';
            else if (tool == 1) name = 'target';
            else if (tool == 2) name = 'ruler';
        }
        else if (control == 1){  //measurement controls
            if (tool == 0) name = 'circle';
            else if (tool == 1) name = 'cone';
            else if (tool == 2) name = 'rect';
            else if (tool == 3) name = 'ray';
            else if (tool == 4) name = 'clear';
        }
        else if (control == 2){  //tile controls
            if (tool == 0) name = 'select';
            else if (tool == 1) name = 'tile';
            else if (tool == 2) name = 'browse';
        }
        else if (control == 3){  //drawing tools
            if (tool == 0) name = 'select';
            else if (tool == 1) name = 'rect';
            else if (tool == 2) name = 'ellipse';
            else if (tool == 3) name = 'polygon';
            else if (tool == 4) name = 'freehand';
            else if (tool == 5) name = 'text';
            else if (tool == 6) name = 'configure';
            else if (tool == 7) name = 'clear';
        }
        else if (control == 4){  //wall controls
            if (tool == 0) name = 'select';
            else if (tool == 1) name = 'walls';
            else if (tool == 2) name = 'terrain';
            else if (tool == 3) name = 'invisible';
            else if (tool == 4) name = 'ethereal';
            else if (tool == 5) name = 'doors';
            else if (tool == 6) name = 'secret';
            else if (tool == 7) name = 'clone';
            else if (tool == 8) name = 'snap';
            else if (tool == 9) name = 'clear';
        }
        else if (control == 5){  //lighting controls
            if (tool == 0) name = 'light';
            else if (tool == 1) name = 'day';
            else if (tool == 2) name = 'night';
            else if (tool == 3) name = 'reset';
            else if (tool == 4) name = 'clear';
        }
        else if (control == 6){  //ambient sound controls
            if (tool == 0) name = 'sound';
            else if (tool == 1) name = 'clear';
        }
        else if (control == 7){  //journal notes
            if (tool == 0) name = 'select';
            else if (tool == 1) name = 'toggle';
            else if (tool == 2) name = 'clear';
        }
        return name;
    }

    //////////////////////////////////////////////////////////////////////////////////////////

    updateDarkness(settings,context){
        let func = settings.darknessFunction;
        if (func == undefined) func = 0;

        let value = settings.darknessValue;
        if (value == undefined) value = 0;

        let background = settings.background;
        if (background == undefined) background = "#000000";

        let src = "";
        let txt = "";

        if (func == 0){ //value
            src = 'action/images/other/darkness/darkness.png';
        }
        else if (func == 1){ //increase/decrease
            if (value < 0) src = 'action/images/other/darkness/decreasedarkness.png';
            else src = 'action/images/other/darkness/increasedarkness.png';
        }
        else if (func == 2){    //display darkness
            src = 'action/images/other/darkness/darkness.png';
            let darkness = '';
            if (canvas.scene != null) darkness = Math.floor(canvas.scene.data.darkness*100)/100;
            txt += darkness;
        }
        streamDeck.setTitle(txt,context);
        streamDeck.setIcon(0, context,src,background);
    }

    keyPressDarkness(settings) {
        if (canvas.scene == null) return;
        let func = settings.darknessFunction;
        if (func == undefined) func = 0;

        let value = parseFloat(settings.darknessValue);
        if (value == undefined) value = 0;

        if (func == 0){ //value
            canvas.scene.update({darkness: value});
        }
        else if (func == 1){ //increase/decrease
            let darkness = canvas.scene.data.darkness;
            darkness += -1*value;
            if (darkness > 1) darkness = 1;
            if (darkness < 0) darkness = 0;
            canvas.scene.update({darkness: darkness});
        }
    }

    //////////////////////////////////////////////////////////////////////////////////////////

    updateRollTable(settings,context){
        let name = settings.rollTableName;
        if (name == undefined) return;

        let background = settings.background;
        if (background == undefined) background = "#000000";

        let table = game.tables.entities.find(p=>p.name == name);

        let txt = "";
        let src = "";

        if (table != undefined) {
            if (settings.displayRollIcon) src = table.data.img;
            if (settings.displayRollName) txt = table.name;
        }
        streamDeck.setTitle(txt,context);
        streamDeck.setIcon(1, context,src,background);
    }

    keyPressRollTable(settings){
        let func = settings.rolltableFunction;
        if (func == undefined) func = 0;

        let name = settings.rollTableName;
        if (name == undefined) return;

        let background = settings.background;
        if (background == undefined) background = "#000000";

        let table = game.tables.entities.find(p=>p.name == name);

        if (table != undefined) {
            if (func == 0){ //open
                table.sheet.render(true);
            }
            else if (func == 1) {//Public roll
                table.draw({rollMode:"roll"});
            }
            else if (func == 2) {//private roll
                table.draw({rollMode:"selfroll"});
            }
        }
    }

    //////////////////////////////////////////////////////////////////////////////////////////

    getSidebarId(nr){
        let id;
        if (nr == 0) id = 'chat';
        else if (nr == 1) id = 'combat';
        else if (nr == 2) id = 'scenes';
        else if (nr == 3) id = 'actors';
        else if (nr == 4) id = 'items';
        else if (nr == 5) id = 'journal';
        else if (nr == 6) id = 'tables';
        else if (nr == 7) id = 'playlists';
        else if (nr == 8) id = 'compendium';
        else if (nr == 9) id = 'settings';
        else id = '';
        return id;
    }

    getSidebarName(nr){
        let name;
        if (nr == 0) name = game.i18n.localize("SIDEBAR.TabChat");
        else if (nr == 1) name = game.i18n.localize("SIDEBAR.TabCombat");
        else if (nr == 2) name = game.i18n.localize("SIDEBAR.TabScenes");
        else if (nr == 3) name = game.i18n.localize("SIDEBAR.TabActors");
        else if (nr == 4) name = game.i18n.localize("SIDEBAR.TabItems");
        else if (nr == 5) name = game.i18n.localize("SIDEBAR.TabJournal");
        else if (nr == 6) name = game.i18n.localize("SIDEBAR.TabTables");
        else if (nr == 7) name = game.i18n.localize("SIDEBAR.TabPlaylists");
        else if (nr == 8) name = game.i18n.localize("SIDEBAR.TabCompendium");
        else if (nr == 9) name = game.i18n.localize("SIDEBAR.TabSettings");
        else if (nr == 10) name = game.i18n.localize("SIDEBAR.CollapseToggle");
        return name;
    }

    getSidebarIcon(nr){
        let icon;
        if (nr == 0) icon = window.CONFIG.ChatMessage.sidebarIcon;
        else if (nr == 1) icon = window.CONFIG.Combat.sidebarIcon;
        else if (nr == 2) icon = window.CONFIG.Scene.sidebarIcon;
        else if (nr == 3) icon = window.CONFIG.Actor.sidebarIcon;
        else if (nr == 4) icon = window.CONFIG.Item.sidebarIcon;
        else if (nr == 5) icon = window.CONFIG.JournalEntry.sidebarIcon;
        else if (nr == 6) icon = window.CONFIG.RollTable.sidebarIcon;
        else if (nr == 7) icon = window.CONFIG.Playlist.sidebarIcon;
        else if (nr == 8) icon = "fas fa-atlas";
        else if (nr == 9) icon = "fas fa-cogs";
        else if (nr == 10) icon = "fas fa-caret-right";
        return icon;
    }
    
    updateSidebar(settings,context){
        let sidebarTab = settings.sidebarTab;
        if (sidebarTab == undefined) sidebarTab = 0;

        let activeTab = ui.sidebar.activeTab;
        let collapsed = ui.sidebar._collapsed;

        let name = "";
        let icon = "";

        let background = settings.background;
        if(background == undefined) background = '#000000';

        let ringColor = "#000000";

        let ringOffColor = settings.offRing;
        if (ringOffColor == undefined) ringOffColor = '#000000';

        let ringOnColor = settings.onRing;
        if (ringOnColor == undefined) ringOnColor = '#00FF00';

        if (settings.displaySidebarName) name = this.getSidebarName(sidebarTab);
        if (settings.displaySidebarIcon) icon = this.getSidebarIcon(sidebarTab);

        if ((sidebarTab == 10 && collapsed)) 
            ringColor = ringOnColor;
        else    
            ringColor = ringOffColor;
        streamDeck.setTitle(name,context);
        streamDeck.setIcon(1,context,icon,background,2,ringColor);
    }

    keyPressSidebar(settings){
        let sidebarTab = settings.sidebarTab;
        if (sidebarTab == undefined) sidebarTab = 0;
        let collapsed = ui.sidebar._collapsed;

        if (sidebarTab < 10) ui.sidebar.activateTab(this.getSidebarId(sidebarTab));
        else if (collapsed) ui.sidebar.expand();
        else if (collapsed == false) ui.sidebar.collapse();
    }

    //////////////////////////////////////////////////////////////////////////////////////////

    updateCompendium(settings,context){
        let background = settings.background;
        if(background == undefined) background = '#000000';

        let name = settings.compendiumName;
        if (name == undefined) return;

        const compendium = game.packs.entries.find(p=>p.metadata.label == name);
        if (compendium == undefined) return;

        let ringColor = "#000000";

        let ringOffColor = settings.offRing;
        if (ringOffColor == undefined) ringOffColor = '#000000';

        let ringOnColor = settings.onRing;
        if (ringOnColor == undefined) ringOnColor = '#00FF00';

        if (compendium.rendered) ringColor = ringOnColor;
        else ringColor = ringOffColor;

        if (settings.displayCompendiumName) streamDeck.setTitle(name,context);
        streamDeck.setIcon(0,context,"",background,2,ringColor);
    }

    keyPressCompendium(settings){
        let name = settings.compendiumName;
        if (name == undefined) return;

        const compendium = game.packs.entries.find(p=>p.metadata.label == name);
        if (compendium == undefined) return;
        if (compendium.rendered) compendium.close();
        else compendium.render(true);
    }

    //////////////////////////////////////////////////////////////////////////////////////////

    //Journals
    //game.journal.entries[0].render(true)

    updateJournal(settings,context){
        let background = settings.background;
        if(background == undefined) background = '#000000';

        let name = settings.compendiumName;
        if (name == undefined) return;
        const journal = game.journal.entries.find(p=>p.name == name);
        if (journal == undefined) return;

        let ringColor = "#000000";

        let ringOffColor = settings.offRing;
        if (ringOffColor == undefined) ringOffColor = '#000000';

        let ringOnColor = settings.onRing;
        if (ringOnColor == undefined) ringOnColor = '#00FF00';
       
        if (journal.sheet.rendered) ringColor = ringOnColor;
        else ringColor = ringOffColor;
        
        if (settings.displayCompendiumName) streamDeck.setTitle(name,context);
        streamDeck.setIcon(0,context,"",background,2,ringColor);
    }

    keyPressJournal(settings){
        let name = settings.compendiumName;
        if (name == undefined) return;

        const journal = game.journal.entries.find(p=>p.name == name);
        if (journal == undefined) return;
        
        journal.render(true);
    }
}