var status_interval;
var conn_fail_counter = 0;

$(function() {
    $('#update-host').on('submit', update_host);
    $('#verify-dns').on('click', verify_dns);
    $('#verify-https').on('click', verify_https);
    $('#verify-http').on('click', verify_http);
    $('#cert-method').on('change', toggle_cert_method);
    $('#update-cert').on('submit', update_cert);
    $('#app-manager')
        .on('click', '.app-visible', update_app_visibility)
        .on('click', '.app-autostart', update_app_autostart)
        .on('click', '.app-start', start_app)
        .on('click', '.app-stop', stop_app)
        .on('click', '.app-install', install_app)
        .on('click', '.app-uninstall', uninstall_app)
        .on('click', '.app-update', update_app)
        .on('click', '.app-clear-status', clear_app_status);
    $('#update-password').on('submit', update_password);
    $('#reboot-vm').on('click', reboot_vm);
    $('#shutdown-vm').on('click', shutdown_vm);
    if ($('#app-manager').length) {
        status_interval = setInterval(get_app_status, 1000);
    }
});

function lost_connection_alert() {
    alert('Spojení se serverem bylo ztraceno');
}

function update_host() {
    $('#host-submit').hide();
    $('#host-message').hide();
    $.post('/update-host', {'domain': $('#domain').val(), 'port': $('#port').val()}, function(data) {
        if (data.error) {
            $('#host-message').attr('class','error').html(data.error).show();
            $('#host-submit').show();
        } else {
            $('#host-message').attr('class','info').html(data.ok).show();
            $('input').prop('disabled', true);
            $('.setup-box').slice(1).css('opacity', '0.5');
        }
    }).fail(lost_connection_alert);
    return false;
}

function verify_dns() {
    $('#verify-dns').hide();
    $('#dns-message').hide();
    $('#dns-wait').show();
    $.get('/verify-dns', function(data) {
        $('#dns-wait').hide();
        if (data.error) {
            $('#dns-message').attr('class','error').html(data.error).show();
            $('#verify-dns').show();
        } else {
            $('#dns-message').attr('class','info').html(data.ok).show();
        }
    }).fail(lost_connection_alert);
    return false;
}

function _verify_http(proto) {
    $('#verify-'+proto).hide();
    $('#'+proto+'-message').hide();
    $('#'+proto+'-wait').show();
    $.get('/verify-' + proto, function(data) {
        $('#'+proto+'-wait').hide();
        if (data.error) {
            $('#'+proto+'-message').attr('class','error').html(data.error).show();
            $('#verify-'+proto).show();
        } else {
            $('#'+proto+'-message').attr('class','info').html(data.ok).show();
        }
    }).fail(lost_connection_alert);
    return false;
}

function verify_http() {
    return _verify_http('http');
}

function verify_https() {
    return _verify_http('https');
}

function toggle_cert_method() {
    if ($('#cert-method').val() == 'manual') {
        $('.cert-upload').show();
    } else {
        $('.cert-upload').hide();
    }
}

function update_cert() {
    $('#cert-submit').hide();
    $('#cert-message').hide();
    $('#cert-wait').show();
    $.ajax({url: '/update-cert', type: 'POST', data: new FormData($('#update-cert')[0]), cache: false, contentType: false, processData: false, success: function(data) {
        $('#cert-wait').hide();
        if (data.error) {
            $('#cert-message').attr('class','error').html(data.error).show();
            $('#cert-submit').show();
        } else {
            $('#cert-message').attr('class','info').html(data.ok).show();
        }
    }}).fail(lost_connection_alert);
    return false;
}

function _update_app(item, ev) {
    var el = $(ev.target);
    var app = el.closest('tr').data('app');
    var value = el.is(':checked') ? 'true' : '';
    $.post('/update-app-'+item, {'app': app, 'value': value}, function(data) {
        if (data.error) {
            el.prop('checked', !value);
            alert(data.error);
        }
    }).fail(lost_connection_alert);
}

function update_app_visibility(ev) {
    return _update_app('visibility', ev);
}

function update_app_autostart(ev) {
    return _update_app('autostart', ev);
}

function _do_app(url, ev) {
    var el = $(ev.target);
    var tr = el.closest('tr');
    var td = el.closest('td');
    td.html('<div class="loader"></div>');
    clearInterval(status_interval);
    $.post(url, {'app': tr.data('app')}, function(data) {
        if (data.error) {
            alert(data.error);
        } else {
            $('#app-manager tbody').html(data.ok);
        }
        status_interval = setInterval(get_app_status, 1000);
    }).fail(lost_connection_alert);
    return false;
}

function start_app(ev) {
    return _do_app('/start-app', ev);
}

function stop_app(ev) {
    return _do_app('/stop-app', ev);
}

function install_app(ev) {
    return _do_app('/install-app', ev);
}

function uninstall_app(ev) {
    var app = $(ev.target).closest('tr').children().first().text()
    if (confirm('Opravdu chcete odinstalovat aplikaci '+app+'?')) {
        return _do_app('/uninstall-app', ev);
    }
    return false;
}

function update_app(ev) {
    return _do_app('/update-app', ev);
}

function clear_app_status(ev) {
    return _do_app('/clear-app-status', ev);
}

function get_app_status() {
    $.get('/get-app-status', function(data) {
        $('#app-manager tbody').html(data.ok);
        conn_fail_counter = 0;
    }).fail(function() {
        conn_fail_counter++;
        if (conn_fail_counter == 10) {
            lost_connection_alert();
            clearInterval(status_interval);
        }
    });
}

function update_password() {
    $('#password-submit').hide();
    $('#password-message').hide();
    $('#password-wait').show();
    $.post('/update-password', {'oldpassword': $('#oldpassword').val(), 'newpassword': $('#newpassword').val(), 'newpassword2': $('#newpassword2').val()}, function(data) {
        $('#password-wait').hide();
        if (data.error) {
            $('#password-message').attr('class','error').html(data.error).show();
            $('#password-submit').show();
        } else {
            $('#password-message').attr('class','info').html(data.ok).show();
        }
    }).fail(lost_connection_alert);
    return false;
}

function _do_vm(action) {
    $.get('/'+action+'-vm', function(data) {
        if (data.error) {
            $('#vm-message').attr('class','error').html(data.error).show();
        } else {
            $('#vm-message').attr('class','info').html(data.ok).show();
        }
    }).fail(lost_connection_alert);
}

function reboot_vm() {
    if (confirm('Opravdu chcete restartovat VM?')) {
        _do_vm('reboot');
    }
    return false;
}

function shutdown_vm() {
    if (confirm('Opravdu chcete vypnout VM?')) {
        _do_vm('shutdown');
    }
    return false;
}
