// 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/>.

/**
 * Wrapper for the YUI M.core.notification class. Allows us to
 * use the YUI version in AMD code until it is replaced.
 *
 * @module     tool_lp/dialogue
 * @copyright  2015 Damyon Wiese <damyon@moodle.com>
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
 */
define(['core/yui'], function(Y) {

    // Private variables and functions.
    /**
     * Constructor
     *
     * @param {String} title Title for the window.
     * @param {String} content The content for the window.
     * @param {function} afterShow Callback executed after the window is opened.
     * @param {function} afterHide Callback executed after the window is closed.
     * @param {Boolean} wide Specify we want an extra wide dialogue (the size is standard, but wider than the default).
     * @param {String} height The height of the dialogue.
     */
    var dialogue = function(title, content, afterShow, afterHide, wide, height) {
        M.util.js_pending('tool_lp/dialogue:dialogue');

        this.yuiDialogue = null;
        var parent = this;

        // Default for wide is false.
        if (typeof wide == 'undefined') {
            wide = false;
        }

        Y.use('moodle-core-notification', 'timers', function() {
            var width = '480px';
            if (wide) {
                width = '800px';
            }

            if (!height) {
                height = 'auto';
            }

            parent.yuiDialogue = new M.core.dialogue({
                headerContent: title,
                bodyContent: content,
                draggable: true,
                visible: false,
                center: true,
                modal: true,
                width: width,
                height: height
            });

            parent.yuiDialogue.before('visibleChange', function() {
                M.util.js_pending('tool_lp/dialogue:before:visibleChange');
            });

            parent.yuiDialogue.after('visibleChange', function(e) {
                if (e.newVal) {
                    // Delay the callback call to the next tick, otherwise it can happen that it is
                    // executed before the dialogue constructor returns.
                    if ((typeof afterShow !== 'undefined')) {
                        Y.soon(function() {
                            afterShow(parent);
                            parent.yuiDialogue.centerDialogue();
                            M.util.js_complete('tool_lp/dialogue:before:visibleChange');
                        });
                    } else {
                        M.util.js_complete('tool_lp/dialogue:before:visibleChange');
                    }
                } else {
                    if ((typeof afterHide !== 'undefined')) {
                        Y.soon(function() {
                            afterHide(parent);
                            M.util.js_complete('tool_lp/dialogue:before:visibleChange');
                        });
                    } else {
                        M.util.js_complete('tool_lp/dialogue:before:visibleChange');
                    }
                }
            });

            parent.yuiDialogue.show();
            M.util.js_complete('tool_lp/dialogue:dialogue');
        });
    };

    /**
     * Close this window.
     */
    dialogue.prototype.close = function() {
        this.yuiDialogue.hide();
        this.yuiDialogue.destroy();
    };

    /**
     * Get content.
     * @return {node}
     */
    dialogue.prototype.getContent = function() {
        return this.yuiDialogue.bodyNode.getDOMNode();
    };

    return /** @alias module:tool_lp/dialogue */ dialogue;
});
