"use strict";

const settings = (function() {
    const dialogEl = $("#settings-dialog");
    const tabsEl = $("#settings-tabs");

    const settingModules = [];

    function addModule(module) {
        settingModules.push(module);
    }

    async function showDialog() {
        glob.activeDialog = dialogEl;

        const settings = await server.get('settings');

        dialogEl.dialog({
            modal: true,
            width: 900
        });

        tabsEl.tabs();

        for (const module of settingModules) {
            if (module.settingsLoaded) {
                module.settingsLoaded(settings);
            }
        }
    }

    async function saveSettings(settingName, settingValue) {
        await server.post('settings', {
            name: settingName,
            value: settingValue
        });

        showMessage("Settings change have been saved.");
    }

    return {
        showDialog,
        saveSettings,
        addModule
    };
})();

settings.addModule((function() {
    const formEl = $("#change-password-form");
    const oldPasswordEl = $("#old-password");
    const newPassword1El = $("#new-password1");
    const newPassword2El = $("#new-password2");

    function settingsLoaded(settings) {
    }

    formEl.submit(() => {
        const oldPassword = oldPasswordEl.val();
        const newPassword1 = newPassword1El.val();
        const newPassword2 = newPassword2El.val();

        oldPasswordEl.val('');
        newPassword1El.val('');
        newPassword2El.val('');

        if (newPassword1 !== newPassword2) {
            alert("New passwords are not the same.");
            return false;
        }

        server.post('password/change', {
            'current_password': oldPassword,
            'new_password': newPassword1
        }).then(result => {
            if (result.success) {
                alert("Password has been changed. Trilium will be reloaded after you press OK.");

                // password changed so current protected session is invalid and needs to be cleared
                protected_session.resetProtectedSession();
            }
            else {
                showError(result.message);
            }
        });

        return false;
    });

    return {
        settingsLoaded
    };
})());

settings.addModule((function() {
    const formEl = $("#protected-session-timeout-form");
    const protectedSessionTimeoutEl = $("#protected-session-timeout-in-seconds");
    const settingName = 'protected_session_timeout';

    function settingsLoaded(settings) {
        protectedSessionTimeoutEl.val(settings[settingName]);
    }

    formEl.submit(() => {
        const protectedSessionTimeout = protectedSessionTimeoutEl.val();

        settings.saveSettings(settingName, protectedSessionTimeout).then(() => {
            protected_session.setProtectedSessionTimeout(protectedSessionTimeout);
        });

        return false;
    });

    return {
        settingsLoaded
    };
})());

settings.addModule((function () {
    const formEl = $("#history-snapshot-time-interval-form");
    const timeIntervalEl = $("#history-snapshot-time-interval-in-seconds");
    const settingName = 'history_snapshot_time_interval';

    function settingsLoaded(settings) {
        timeIntervalEl.val(settings[settingName]);
    }

    formEl.submit(() => {
        settings.saveSettings(settingName, timeIntervalEl.val());

        return false;
    });

    return {
        settingsLoaded
    };
})());

settings.addModule((async function () {
    const appVersionEl = $("#app-version");
    const dbVersionEl = $("#db-version");
    const buildDateEl = $("#build-date");
    const buildRevisionEl = $("#build-revision");

    const appInfo = await server.get('app-info');

    appVersionEl.html(appInfo.app_version);
    dbVersionEl.html(appInfo.db_version);
    buildDateEl.html(appInfo.build_date);
    buildRevisionEl.html(appInfo.build_revision);
    buildRevisionEl.attr('href', 'https://github.com/zadam/trilium/commit/' + appInfo.build_revision);

    return {};
})());

settings.addModule((async function () {
    const forceFullSyncButton = $("#force-full-sync-button");
    const fillSyncRowsButton = $("#fill-sync-rows-button");
    const anonymizeButton = $("#anonymize-button");
    const cleanupSoftDeletedButton = $("#cleanup-soft-deleted-items-button");
    const vacuumDatabaseButton = $("#vacuum-database-button");

    forceFullSyncButton.click(async () => {
        await server.post('sync/force-full-sync');

        showMessage("Full sync triggered");
    });

    fillSyncRowsButton.click(async () => {
        await server.post('sync/fill-sync-rows');

        showMessage("Sync rows filled successfully");
    });


    anonymizeButton.click(async () => {
        await server.post('anonymization/anonymize');

        showMessage("Created anonymized database");
    });

    cleanupSoftDeletedButton.click(async () => {
        if (confirm("Do you really want to clean up soft-deleted items?")) {
            await server.post('cleanup/cleanup-soft-deleted-items');

            showMessage("Soft deleted items have been cleaned up");
        }
    });

    vacuumDatabaseButton.click(async () => {
        await server.post('cleanup/vacuum-database');

        showMessage("Database has been vacuumed");
    });

    return {};
})());