$(function () {
    setInterval(function () {
        var $el = $(".animated-ellipsis");
        var ellipsis = $el.html();
        ellipsis = ellipsis + ".";
        if (ellipsis.length > 3) {
            ellipsis = "";
        }
        $el.html(ellipsis);
    }, 400);
    update.process();
});

var update = {
    vars: {},
    process: function (callback) { // S0: Check if update is needed
        var _this = this;
        _this.addLog(PF.fn._s("Installed version is v%s", vars.current_version));
        $.ajax({
            url: vars.url,
            data: { action: "ask" }
        })
            .always(function (data, status, XHR) {
                if(typeof data.status_code ==  typeof undefined || !XHR) {
                    _this.abort(PF.fn._s("Can't connect to %s", 'internal API (action:ask)'), 100);
                    return;
                }
                if (data.status_code == 200) {
                    _this.addLog(PF.fn._s("Last available release is v%s", data.software.current_version));
                    if (PF.fn.versionCompare(vars.current_version, data.software.current_version) == -1) { // Can update
                        _this.vars.target_version = data.software.current_version;
                        _this.addLog(PF.fn._s("Update needed, proceeding to download"));
                        _this.download(function () {
                            _this.extract(function () {
                                _this.install();
                            });
                        });
                    } else {
                        $("h1").html(PF.fn._s("No update needed"));
                        _this.addLog(PF.fn._s("System files already up to date", vars.current_version));
                        _this.install();
                    }
                } else {
                    _this.abort("error" in data && "message" in data.error ? data.error.message : status, 400);
                }
            });
    },
    download: function (callback) {
        var _this = this;
        _this.addLog(PF.fn._s("Starting v%s download", this.vars.target_version));
        $.ajax({
            url: vars.url,
            data: { action: "download", version: _this.vars.target_version },
        }).always(function (data, status, XHR) {
            if(typeof data.status_code ==  typeof undefined || !XHR) {
                _this.abort(PF.fn._s("Can't connect to %s", 'internal API (action:download)'), 100);
                return;
            }
            if (data.status_code == 200) {
                _this.vars.target_filename = data.download.filename;
                _this.addLog(PF.fn._s("Downloaded v%s, proceeding to extraction", _this.vars.target_version));
                if (typeof callback == "function") {
                    callback();
                }
            } else {
                _this.abort("error" in data && "message" in data.error ? data.error.message : status, 400);
            }
        });

    },
    extract: function (callback) {
        var _this = this;
        _this.addLog(PF.fn._s("Attempting to extract v%s", this.vars.target_version));
        $.ajax({
            url: vars.url,
            data: { action: "extract", file: _this.vars.target_filename },
        }).always(function (data, status, XHR) {
            if (!XHR) {
                _this.abort(PF.fn._s("Can't connect to %s", vars.url), 400);
                return;
            }
            if (data.status_code == 200) {
                _this.addLog(PF.fn._s("Extraction completed", _this.vars.target_version));
                setTimeout(function () {
                    _this.addLog(PF.fn._s("Proceding to install the update", _this.vars.target_version));
                    if (typeof callback == "function") {
                        callback();
                    }
                }, 500);
            } else {
                _this.abort(data.responseJSON.error.message, 400);
            }
        });
    },
    install: function () {
        var _this = this;
        setTimeout(function () {
            window.location = PF.obj.config.base_url + "/install";
        }, 2000);
    },
    addLog: function (message, code) {
        if (!code) code = 200;
        var $el = $("ul");
        var d = PF.fn.getDateTime().substring(11);
        var $event = $("<li/>", {
            class: code != 200 ? 'color-red' : null,
            text: d + ' ' + message
        });
        $el.prepend($event);
    },
    abort: function (message) {
        $("h1").html(PF.fn._s("Update failed"));
        if (message) {
            this.addLog(message, 400);
        }
    }
};