/*

What in the heck is a zcommand?

    A zcommand is basically a specific type of slash
    command where the client does almost no work and
    the server just does something pretty simple like
    flip a setting.

    The first zcommand we wrote is for "/ping", and
    the server just responds with a 200 for that.

    Not all slash commands use zcommand under the hood.
    For more exotic things like /poll see submessage.js
    and widgetize.js

*/

exports.send = function (opts) {
    const command = opts.command;
    const on_success = opts.on_success;
    const data = {
        command: command,
    };

    channel.post({
        url: '/json/zcommand',
        data: data,
        success: function (data) {
            if (on_success) {
                on_success(data);
            }
        },
        error: function () {
            exports.tell_user('server did not respond');
        },
    });
};

exports.tell_user = function (msg) {
    // This is a bit hacky, but we don't have a super easy API now
    // for just telling users stuff.
    $('#compose-send-status').removeClass(common.status_classes)
        .addClass('alert-error')
        .stop(true).fadeTo(0, 1);
    $('#compose-error-msg').text(msg);
};

exports.enter_day_mode = function () {
    exports.send({
        command: "/day",
        on_success: function (data) {
            night_mode.disable();
            feedback_widget.show({
                populate: function (container) {
                    const rendered_msg = marked(data.msg).trim();
                    container.html(rendered_msg);
                },
                on_undo: function () {
                    exports.send({
                        command: "/night",
                    });
                },
                title_text: i18n.t("Day mode"),
                undo_button_text: i18n.t("Night"),
            });
        },
    });
};

exports.enter_night_mode = function () {
    exports.send({
        command: "/night",
        on_success: function (data) {
            night_mode.enable();
            feedback_widget.show({
                populate: function (container) {
                    const rendered_msg = marked(data.msg).trim();
                    container.html(rendered_msg);
                },
                on_undo: function () {
                    exports.send({
                        command: "/day",
                    });
                },
                title_text: i18n.t("Night mode"),
                undo_button_text: i18n.t("Day"),
            });
        },
    });
};

exports.enter_fluid_mode = function () {
    exports.send({
        command: "/fluid-width",
        on_success: function (data) {
            scroll_bar.set_layout_width();
            feedback_widget.show({
                populate: function (container) {
                    const rendered_msg = marked(data.msg).trim();
                    container.html(rendered_msg);
                },
                on_undo: function () {
                    exports.send({
                        command: "/fixed-width",
                    });
                },
                title_text: i18n.t("Fluid width mode"),
                undo_button_text: i18n.t("Fixed width"),
            });
        },
    });
};

exports.enter_fixed_mode = function () {
    exports.send({
        command: "/fixed-width",
        on_success: function (data) {
            scroll_bar.set_layout_width();
            feedback_widget.show({
                populate: function (container) {
                    const rendered_msg = marked(data.msg).trim();
                    container.html(rendered_msg);
                },
                on_undo: function () {
                    exports.send({
                        command: "/fluid-width",
                    });
                },
                title_text: i18n.t("Fixed width mode"),
                undo_button_text: i18n.t("Fluid width"),
            });
        },
    });
};

exports.process = function (message_content) {

    const content = message_content.trim();

    if (content === '/ping') {
        const start_time = new Date();

        exports.send({
            command: content,
            on_success: function () {
                const end_time = new Date();
                let diff = end_time - start_time;
                diff = Math.round(diff);
                const msg = "ping time: " + diff + "ms";
                exports.tell_user(msg);
            },
        });
        return true;
    }

    const day_commands = ['/day', '/light'];
    if (day_commands.includes(content)) {
        exports.enter_day_mode();
        return true;
    }

    const night_commands = ['/night', '/dark'];
    if (night_commands.includes(content)) {
        exports.enter_night_mode();
        return true;
    }

    if (content === '/fluid-width') {
        exports.enter_fluid_mode();
        return true;
    }

    if (content === '/fixed-width') {
        exports.enter_fixed_mode();
        return true;
    }

    if (content === '/settings') {
        hashchange.go_to_location('settings/your-account');
        return true;
    }

    // It is incredibly important here to return false
    // if we don't see an actual zcommand, so that compose.js
    // knows this is a normal message.
    return false;
};

window.zcommand = exports;
