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

/**
 * A javascript module to store calendar drag and drop data.
 *
 * This module is unfortunately required because of the limitations
 * of the HTML5 drag and drop API and it's ability to provide data
 * between the different stages of the drag/drop lifecycle.
 *
 * @module     core_calendar/drag_drop_data_store
 * @copyright  2017 Ryan Wyllie <ryan@moodle.com>
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
 */
define([], function() {
    /* @var {int|null} eventId The id of the event being dragged */
    var eventId = null;
    /* @var {int|null} durationDays How many days the event spans */
    var durationDays = null;
    /* @var {int|null} minTimestart The earliest valid timestart */
    var minTimestart = null;
    /* @var {int|null} maxTimestart The latest valid tiemstart */
    var maxTimestart = null;
    /* @var {string|null} minError Error message for min timestamp violation */
    var minError = null;
    /* @var {string|null} maxError Error message for max timestamp violation */
    var maxError = null;

    /**
     * Store the id of the event being dragged.
     *
     * @param {int} id The event id
     */
    var setEventId = function(id) {
        eventId = id;
    };

    /**
     * Get the stored event id.
     *
     * @return {int|null}
     */
    var getEventId = function() {
        return eventId;
    };

    /**
     * Check if the store has an event id.
     *
     * @return {bool}
     */
    var hasEventId = function() {
        return eventId !== null;
    };

    /**
     * Store the duration (in days) of the event being dragged.
     *
     * @param {int} days Number of days the event spans
     */
    var setDurationDays = function(days) {
        durationDays = days;
    };

    /**
     * Get the stored number of days.
     *
     * @return {int|null}
     */
    var getDurationDays = function() {
        return durationDays;
    };

    /**
     * Store the minimum timestart valid for an event being dragged.
     *
     * @param {int} timestamp The unix timstamp
     */
    var setMinTimestart = function(timestamp) {
        minTimestart = timestamp;
    };

    /**
     * Get the minimum valid timestart.
     *
     * @return {int|null}
     */
    var getMinTimestart = function() {
        return minTimestart;
    };

    /**
     * Check if a minimum timestamp is set.
     *
     * @return {bool}
     */
    var hasMinTimestart = function() {
        return minTimestart !== null;
    };

    /**
     * Store the maximum timestart valid for an event being dragged.
     *
     * @param {int} timestamp The unix timstamp
     */
    var setMaxTimestart = function(timestamp) {
        maxTimestart = timestamp;
    };

    /**
     * Get the maximum valid timestart.
     *
     * @return {int|null}
     */
    var getMaxTimestart = function() {
        return maxTimestart;
    };

    /**
     * Check if a maximum timestamp is set.
     *
     * @return {bool}
     */
    var hasMaxTimestart = function() {
        return maxTimestart !== null;
    };

    /**
     * Store the error string to display if trying to drag an event
     * earlier than the minimum allowed date.
     *
     * @param {string} message The error message
     */
    var setMinError = function(message) {
        minError = message;
    };

    /**
     * Get the error message for a minimum time start violation.
     *
     * @return {string|null}
     */
    var getMinError = function() {
        return minError;
    };

    /**
     * Store the error string to display if trying to drag an event
     * later than the maximum allowed date.
     *
     * @param {string} message The error message
     */
    var setMaxError = function(message) {
        maxError = message;
    };

    /**
     * Get the error message for a maximum time start violation.
     *
     * @return {string|null}
     */
    var getMaxError = function() {
        return maxError;
    };

    /**
     * Reset all of the stored values.
     */
    var clearAll = function() {
        setEventId(null);
        setDurationDays(null);
        setMinTimestart(null);
        setMaxTimestart(null);
        setMinError(null);
        setMaxError(null);
    };

    return {
        setEventId: setEventId,
        getEventId: getEventId,
        hasEventId: hasEventId,
        setDurationDays: setDurationDays,
        getDurationDays: getDurationDays,
        setMinTimestart: setMinTimestart,
        getMinTimestart: getMinTimestart,
        hasMinTimestart: hasMinTimestart,
        setMaxTimestart: setMaxTimestart,
        getMaxTimestart: getMaxTimestart,
        hasMaxTimestart: hasMaxTimestart,
        setMinError: setMinError,
        getMinError: getMinError,
        setMaxError: setMaxError,
        getMaxError: getMaxError,
        clearAll: clearAll
    };
});
