// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.

/**
 * Change the course competency settings in a popup.
 *
 * @module     tool_lp/course_competency_settings
 * @copyright  2015 Damyon Wiese <damyon@moodle.com>
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
 */
define(['jquery',
        'core/notification',
        'tool_lp/dialogue',
        'core/str',
        'core/ajax',
        'core/templates',
        'core/pending'
        ],
       function($, notification, Dialogue, str, ajax, templates, Pending) {

    /**
     * Constructor
     *
     * @param {String} selector - selector for the links to open the dialogue.
     */
    var settingsMod = function(selector) {
        $(selector).on('click', this.configureSettings.bind(this));
    };

    /** @property {Dialogue} Reference to the dialogue that we opened. */
    settingsMod.prototype._dialogue = null;

    /**
     * Open the configure settings dialogue.
     *
     * @param {Event} e
     * @method configureSettings
     */
    settingsMod.prototype.configureSettings = function(e) {
        var pendingPromise = new Pending();
        var courseid = $(e.target).closest('a').data('courseid');
        var currentValue = $(e.target).closest('a').data('pushratingstouserplans');
        var context = {
            courseid: courseid,
            settings: {pushratingstouserplans: currentValue}
        };
        e.preventDefault();

        $.when(
            str.get_string('configurecoursecompetencysettings', 'tool_lp'),
            templates.render('tool_lp/course_competency_settings', context),
        )
        .then(function(title, templateResult) {
            this._dialogue = new Dialogue(
                title,
                templateResult[0],
                this.addListeners.bind(this)
            );

            return this._dialogue;
        }.bind(this))
        .then(pendingPromise.resolve)
        .catch(notification.exception);
    };

    /**
     * Add the save listener to the form.
     *
     * @method addSaveListener
     */
    settingsMod.prototype.addListeners = function() {
        var save = this._find('[data-action="save"]');
        save.on('click', this.saveSettings.bind(this));
        var cancel = this._find('[data-action="cancel"]');
        cancel.on('click', this.cancelChanges.bind(this));
    };

    /**
     * Cancel the changes.
     *
     * @param {Event} e
     * @method cancelChanges
     */
    settingsMod.prototype.cancelChanges = function(e) {
        e.preventDefault();
        this._dialogue.close();
    };

    /**
     * Cancel the changes.
     *
     * @param {String} selector
     * @return {JQuery}
     */
    settingsMod.prototype._find = function(selector) {
        return $('[data-region="coursecompetencysettings"]').find(selector);
    };

    /**
     * Save the settings.
     *
     * @param {Event} e
     * @method saveSettings
     */
    settingsMod.prototype.saveSettings = function(e) {
        var pendingPromise = new Pending();
        e.preventDefault();

        var newValue = this._find('input[name="pushratingstouserplans"]:checked').val();
        var courseId = this._find('input[name="courseid"]').val();
        var settings = {pushratingstouserplans: newValue};

        ajax.call([
            {methodname: 'core_competency_update_course_competency_settings',
              args: {courseid: courseId, settings: settings}}
        ])[0]
        .then(function() {
            return this.refreshCourseCompetenciesPage();
        }.bind(this))
        .then(pendingPromise.resolve)
        .catch(notification.exception);

    };

    /**
     * Refresh the course competencies page.
     *
     * @method saveSettings
     */
    settingsMod.prototype.refreshCourseCompetenciesPage = function() {
        var courseId = this._find('input[name="courseid"]').val();
        var pendingPromise = new Pending();

        ajax.call([
            {methodname: 'tool_lp_data_for_course_competencies_page',
              args: {courseid: courseId, moduleid: 0}}
        ])[0]
        .then(function(context) {
            return templates.render('tool_lp/course_competencies_page', context);
        })
        .then(function(html, js) {
            templates.replaceNode($('[data-region="coursecompetenciespage"]'), html, js);
            this._dialogue.close();

            return;
        }.bind(this))
        .then(pendingPromise.resolve)
        .catch(notification.exception);
    };

    return /** @alias module:tool_lp/configurecoursecompetencysettings */ settingsMod;
});
