var wsUrl = 'ws://' + document.location.host + '/ws';

var settings = {
    brightness: 0,
    interval: 0,
    color: {
        r: 255,
        g: 255,
        b: 255,
    }
};

var highscores = {};
var initHighscores = true;

var uiEnabled = false;

$(document).ready(function () {
    enabledUI(false);
    $("#wsMessages, #prompt").val("");
});

$(window).on('load', function () {
    startSocket();
});

$(document).on('change', '.rangeSetting', function () {
    var setting = $(this).data('name');
    var value = $(this).val();
    switch (setting) {
        case 'brightness':
            value = mapRange(value, 1, 100, 8, 255);
            break;
        case 'interval':
            value = mapRange(value, 1, 100, 1000, 10);
            break;
    }
    settings[setting] = value;
    sendSettings();
});

var colorPicker = new iro.ColorPicker('#colorpicker', {
    layout: [
        {
            component: iro.ui.Wheel,
        }
    ]
});

colorPicker.on('input:end', function (color) {
    settings.color = color.rgb;
    sendSettings();
});

$('.btnAction').on('click', function () {
    var action = $(this).data('action');
    sendAction(action);
    if(modalConfirm._isShown) {
        modalConfirm.hide();
    }
});

$('.btnConfirm').on('click', function () {
    $('#modalConfirm').find('.modal-title').text($(this).data('title'));
    $('#modalConfirm').find('.modal-body').text('Do your really want to ' + $(this).data('text') + ' (NFG)');
    $('#modalConfirm').find('.btnAction').data('action', $(this).data('action'));
    modalConfirm.show();
});

$("#prompt").on('keydown', function (e) {
    if (e.keyCode == 13 && $("#prompt").val() != "") {
        var val = $("#prompt").val();
        wsSend(JSON.parse(val));
        $("#prompt").val("");
    }
});

function enabledUI(enable) {
    if (enable) {
        $('#spinner').addClass('invisible');
        $('.btnAction, .btnConfirm, .rangeSetting').prop('disabled', false);
        uiEnabled = true;
    } else {
        $('#spinner').removeClass('invisible');
        $('.btnAction, .btnConfirm, .rangeSetting').prop('disabled', true);
        $('.rangeSetting').prop('disabled', true);
        uiEnabled = false;
    }
}

function addMessage(msg) {
    var txt = $("#wsMessages");
    txt.val($.trim(txt.val() + "\n" + msg));
    txt.scrollTop(txt[0].scrollHeight - txt.height());
}

function sendSettings() {
    if (!uiEnabled) {
        return;
    }
    var payload = {
        'settings': settings
    };
    wsSend(payload);
}

function wsSend(obj) {
    ws.send(obj).done(function () {
        addMessage("➡️ " + JSON.stringify(obj));
    }).fail(function (e) {
        addMessage("❗️ " + JSON.stringify(obj));
    });
}

var ws;
function startSocket() {
    ws = $.simpleWebSocket({
        url: wsUrl,
        timeout: 5000,
        onOpen: function (e) {
            if (ws.isConnected()) {
                console.log("WS: connected");
                addMessage("✅ connected");
                sendAction('getSettings');
            }
        },
        onClose: function (e) {
            enabledUI(false);
            console.log("WS: disconnected");
            addMessage("❌ disconnected");
        },
        onError: function (e) {
            enabledUI(false);
            console.log("WS: error");
            addMessage("❗️ error");
        },
    });

    ws.listen(function (data) {
        addMessage("⬅️ " + JSON.stringify(data));
        if (data.settings) {
            loadSettings(data.settings);
        } else if (data.highscores) {
            updateHighscore(data.highscores);
        } else if (data.stats) {
            updateStats(data.stats);
        }

    });
}

function sendAction(action) {
    var payload = {
        'action': action
    };
    wsSend(payload);
}

function loadSettings(data) {
    settings.brightness = data.brightness;
    settings.interval = data.interval;
    colorPicker.color.rgb = data.color;
    enabledUI(true);
    $('#rangeBrightness').val(mapRange(data.brightness, 8, 255, 1, 100));
    $('#rangeSpeed').val(mapRange(data.interval, 1000, 10, 1, 100));
    sendAction('getHighscores');
}

function updateHighscore(hs) {
    if (initHighscores) {
        $('#hsGames, #hsTicks, #hsCells').css('width', '100%');
        initHighscores = false;
    }
    highscores = hs;
    $('#hsGames').find('.progress-bar').text(hs.games);
    $('#hsTicks').find('.progress-bar').text(hs.ticks);
    $('#hsCells').find('.progress-bar').text(hs.cells);
}

function updateStats(lg) {
    var lastGameWidth = 100 / (highscores.games / lg.game);
    var lastTicksWidth = 100 / (highscores.ticks / lg.ticks);
    var lastCellsWidth = 100 / (highscores.cells / lg.cells);
    var hsGamesWidth = (1 - (lg.game / highscores.games)) * 100;
    var hsTicksWidth = (1 - (lg.ticks / highscores.ticks)) * 100;
    var hsCellsWidth = (1 - (lg.cells / highscores.cells)) * 100;
    $('#hsGames').css('width', hsGamesWidth + '%');
    $('#lastGame').css('width', lastGameWidth + '%');
    $('#lastGame').find('.progress-bar').text(lg.game);
    $('#hsTicks').css('width', hsTicksWidth + '%');
    $('#lastTicks').css('width', lastTicksWidth + '%');
    $('#lastTicks').find('.progress-bar').text(lg.ticks);
    $('#hsCells').css('width', hsCellsWidth + '%');
    $('#lastCells').css('width', lastCellsWidth + '%');
    $('#lastCells').find('.progress-bar').text(lg.cells);
}

function mapRange(number, inMin, inMax, outMin, outMax) {
    return Math.round((number - inMin) * (outMax - outMin) / (inMax - inMin) + outMin);
}

const modalConfirm = new bootstrap.Modal('#modalConfirm', {});