/*!
 * Piwik - free/libre analytics platform
 *
 * @link http://piwik.org
 * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
 */

$(document).ready(function () {
    function toggleBlock(id, value) {
        $('#' + id).toggle(value == 1);
    }

    function isEitherDeleteSectionEnabled() {
        return ($('input[name=deleteEnable]:checked').val() == 1)
            || ($('input[name=deleteReportsEnable]:checked').val() == 1);
    }

    function toggleOtherDeleteSections() {
        var showSection = isEitherDeleteSectionEnabled();
        toggleBlock('deleteDataEstimateSect', showSection);
        toggleBlock('scheduleSettingsHeadline', showSection);
        toggleBlock('databaseSizeHeadline', showSection);
        toggleBlock('deleteSchedulingSettings', showSection);
    }

    // reloads purged database size estimate
    var currentRequest;

    /**
     * @param {boolean} [forceEstimate]  (defaults to false)
     */
    function reloadDbStats(forceEstimate) {
        if (currentRequest) {
            currentRequest.abort();
        }

        // if the section isn't visible or the manual estimate link is showing, abort
        // (unless on first load or forcing)
        var isFirstLoad = $('#deleteDataEstimate').html() == '';
        if (!isFirstLoad
            && forceEstimate !== true
            && (!isEitherDeleteSectionEnabled() || $('#getPurgeEstimateLink').length > 0)) {
            return;
        }

        $('#deleteDataEstimate').hide();

        var data = $('#formDeleteSettings').serializeArray();
        var formData = {};
        for (var i = 0; i < data.length; i++) {
            formData[data[i].name] = data[i].value;
        }
        if (forceEstimate === true) {
            formData['forceEstimate'] = 1;
        }

        currentRequest = new ajaxHelper();
        currentRequest.setLoadingElement('#deleteDataEstimateSect .loadingPiwik');
        currentRequest.addParams({
            module: 'PrivacyManager',
            action: 'getDatabaseSize'
        }, 'get');
        currentRequest.addParams(formData, 'post');
        currentRequest.setCallback(
            function (data) {
                currentRequest = undefined;
                $('#deleteDataEstimate').html(data).show();

                // lock size of db size estimate
                $('#deleteDataEstimateSect').height($('#deleteDataEstimateSect').height());
            }
        );
        currentRequest.setFormat('html');
        currentRequest.send(false);
    }

    // make sure certain sections only display if their corresponding features are enabled
    $('input[name=anonymizeIPEnable]').change(function () {
        toggleBlock("anonymizeIPenabled", $(this).val());
    });

    $('input[name=deleteEnable]').change(function () {
        toggleBlock("deleteLogSettings", $(this).val());
        toggleOtherDeleteSections();
    }).change(reloadDbStats);

    $('input[name=deleteReportsEnable]').change(function () {
        toggleBlock("deleteReportsSettings", $(this).val());
        toggleBlock("deleteOldReportsMoreInfo", $(this).val());
        toggleOtherDeleteSections();
    }).change(reloadDbStats);

    // initial toggling calls
    $(function () {
        toggleBlock("deleteLogSettings", $("input[name=deleteEnable]:checked").val());
        toggleBlock("anonymizeIPenabled", $("input[name=anonymizeIPEnable]:checked").val());
        toggleBlock("deleteReportsSettings", $("input[name=deleteReportsEnable]:checked").val());
        // This one is in an AngularJS directive, so is generated later
        setTimeout(function () {
            toggleBlock("deleteOldReportsMoreInfo", $("input[name=deleteReportsEnable]:checked").val());
        }, 500);
        toggleOtherDeleteSections();
    });

    // make sure the DB size estimate is reloaded every time a delete logs/reports setting is changed
    $('#formDeleteSettings').find('input[type=text]').each(function () {
        $(this).change(reloadDbStats);
    });
    $('#formDeleteSettings').find('input[type=checkbox]').each(function () {
        $(this).click(reloadDbStats);
    });

    // make sure when the delete log/report settings are submitted, a confirmation popup is
    // displayed first
    $('#deleteLogSettingsSubmit').click(function (e) {
        var deletingLogs = $("input[name=deleteEnable]:checked").val() == 1,
            deletingReports = $("input[name=deleteReportsEnable]:checked").val() == 1,
            confirm_id;

        // hide all confirmation texts, then show the correct one based on what
        // type of deletion is enabled.
        $('#confirmDeleteSettings').find('>h2').each(function () {
            $(this).hide();
        });

        if (deletingLogs) {
            confirm_id = deletingReports ? "deleteBothConfirm" : "deleteLogsConfirm";
        }
        else if (deletingReports) {
            confirm_id = "deleteReportsConfirm";
        }

        if (confirm_id) {
            $("#" + confirm_id).show();
            e.preventDefault();

            piwikHelper.modalConfirm('#confirmDeleteSettings', {
                yes: function () {
                    $('#formDeleteSettings').submit();
                }
            });
        }
        else {
            $('#formDeleteSettings').submit();
        }
    });

    // execute purge now link click
    $('#purgeDataNowLink').click(function (e) {
        e.preventDefault();

        var link = this;

        // if any option has been modified, abort purging and instruct user to save first
        var modified = false;
        $('#formDeleteSettings').find('input').each(function () {
            if (this.type === 'checkbox' || this.type === 'radio') {
                modified |= this.defaultChecked !== this.checked;
            } else {
                modified |= this.defaultValue !== this.value;
            }
        });

        if (modified) {
            piwikHelper.modalConfirm('#saveSettingsBeforePurge', {yes: function () {}});
            return;
        }

        // ask user if they really want to delete their old data
        piwikHelper.modalConfirm('#confirmPurgeNow', {
            yes: function () {
                $(link).hide();

                // execute a data purge
                var ajaxRequest = new ajaxHelper();
                ajaxRequest.setLoadingElement('#deleteSchedulingSettings .loadingPiwik');
                ajaxRequest.addParams({
                    module: 'PrivacyManager',
                    action: 'executeDataPurge'
                }, 'get');
                ajaxRequest.setCallback(
                    function () {
                        // force reload
                        $('#deleteDataEstimate').html('');
                        reloadDbStats();

                        // show 'db purged' message
                        $('#db-purged-message').fadeIn('slow');
                        setTimeout(function () {
                            // hide 'db purged' message & show link
                            $('#db-purged-message').fadeOut('slow', function () {
                                $(link).show();
                            });
                        }, 2000);
                    }
                );
                ajaxRequest.setFormat('html');
                ajaxRequest.send(false);
            }
        });
    });

    // get estimate link click
    $('#getPurgeEstimateLink').click(function (e) {
        e.preventDefault();
        reloadDbStats(true);
    });

    // load initial db size estimate
    reloadDbStats();
});
