var OpenWS = new KfetWebsocket({
    relative_url: "open/"
});

var OpenKfet = function (force_close_url, admin) {
    this.force_close_url = force_close_url;
    this.admin = admin;

    this.status = this.UNKNOWN;
    this.dom = {
        status_text: $('.kfetopen .status-text'),
        force_close_btn: $('.kfetopen .force-close-btn'),
        warning: $('.kfetopen .warning')
    }

    this.dom.force_close_btn.click(() => this.toggle_force_close());
    setInterval(() => this.refresh(), this.refresh_interval * 1000);
    OpenWS.add_handler(data => this.refresh(data));

};

OpenKfet.prototype = {
    // Status is unknown after . minutes without update.
    time_unknown: 15,
    // Maximum interval (seconds) between two UI refresh.
    refresh_interval: 20,

    // Prefix for classes describing place status.
    class_prefix: 'kfetopen-st-',
    // Set status-classes on this dom element.
    target: 'body',

    // Status
    OPENED: "opened",
    CLOSED: "closed",
    UNKNOWN: "unknown",

    // Admin status
    FAKE_CLOSED: "fake_closed",

    // Display values
    status_text: {
        opened: "ouverte",
        closed: "fermée",
        unknown: "_____"
    },
    force_text: {
        activate: "Fermer manuellement",
        deactivate: "Réouvrir la K-Fêt"
    },

    get is_recent() {
        return this.last_update && moment().diff(this.last_update, 'minute') <= this.time_unknown;
    },

    refresh: function (data) {
        if (data) {
            $.extend(this, data);
            this.last_update = moment();
        }
        if (!this.is_recent)
            this.status = this.UNKNOWN;
        this.refresh_dom();
    },

    refresh_dom: function () {
        let status = this.status;
        this.clear_class();

        this.add_class(status);
        this.dom.status_text.html(this.status_text[status]);

        // admin specific
        if (this.admin) {
            this.add_class(this.admin_status);
            if (this.force_close) {
                this.dom.warning.show().addClass('in');
                this.dom.force_close_btn.html(this.force_text['deactivate']);
            } else {
                this.dom.warning.removeClass('in').hide();
                this.dom.force_close_btn.html(this.force_text['activate']);
            }
        }
    },

    toggle_force_close: function (password) {
        $.post({
            context: this,
            url: this.force_close_url,
            data: { force_close: !this.force_close },
            beforeSend: function ($xhr) {
                $xhr.setRequestHeader("X-CSRFToken", csrftoken);
                if (password !== undefined)
                    $xhr.setRequestHeader("KFetPassword", password);
            }
        }).fail(function ($xhr) {
            switch ($xhr.status) {
                case 403:
                    requestAuth({ 'errors': {} }, (password) => this.toggle_force_close(password));
                    break;
            }
        });
    },

    clear_class: function () {
        let re = new RegExp('(^|\\s)' + this.class_prefix + '\\S+', 'g');
        $(this.target).attr('class', (i, c) => c ? c.replace(re, '') : '');
    },

    add_class: function (status) {
        $(this.target).addClass(this.class_prefix + status);
    }
};
