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

var config = {
    brightness: 0,
    interval: 0,
};

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

$(document).on('input change', '.rangeConfig', 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;
    }
    config[setting] = value;
    var payload = {
        'config': config
    };
    wsSend(payload);
});

$('.btnAction').on('click', function () {
    var action = $(this).data('action');
    var payload = {
        'action': action
    };
    wsSend(payload);
});

$("#prompt").onkeydown = function (e) {
    if (e.keyCode == 13 && $("#prompt").value != "") {
        var val = $("#prompt").val();
        wsSend(val);
        $("#prompt").val("");
    }
}

function uiEnabled(enabled) {
    if (enabled) {
        $('#spinner').addClass('invisible');
        $('.btnAction').prop('disabled', false);
        $('.rangeConfig').prop('disabled', false);
    } else {
        $('#spinner').removeClass('invisible');
        $('.btnAction').prop('disabled', true);
        $('.rangeConfig').prop('disabled', true);
    }
}

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

function wsSend(msg) {
    uiEnabled(false);
    var json = JSON.stringify(msg);
    ws.send(msg).done(function () {
        addMessage("➡️ " + json);
        uiEnabled(true);
    }).fail(function (e) {
        addMessage("❗️ " + json);
    });
}

var ws;
function startSocket() {
    ws = $.simpleWebSocket({
        url: wsUrl,
        onOpen: function (e) {
            console.log("WS: connected");
            addMessage("✅ connected");
            getConfig();
            uiEnabled(true);
        },
        onClose: function (e) {
            uiEnabled(false);
            console.log("WS: disconnected");
            addMessage("❌ disconnected");
        },
        onError: function (e) {
            uiEnabled(false);
            console.log("WS: error");
            addMessage("❗️ error");
        },
    });

    ws.listen(function (data) {
        console.log(data);
        var json = JSON.stringify(data);
        var msg = "⬅️ " + json;
        addMessage(msg);
        if (data.config) {
            loadConfig(data.config);
        }
    });
}

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

function loadConfig(data) {
    config.brightness = data.brightness;
    config.interval = data.interval;
    $('#rangeBrightness').val(mapRange(data.brightness, 8, 255, 1, 100));
    $('#rangeSpeed').val(mapRange(data.interval, 1000, 10, 1, 100));
}

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