/**
 * DevExtreme (cjs/ui/date_box/ui.date_view.js)
 * Version: 23.2.6 (build 24140-0112)
 * Build date: Sun May 19 2024
 *
 * Copyright (c) 2012 - 2024 Developer Express Inc. ALL RIGHTS RESERVED
 * Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/
 */
"use strict";
exports.default = void 0;
var _renderer = _interopRequireDefault(require("../../core/renderer"));
var _editor = _interopRequireDefault(require("../editor/editor"));
var _ui = _interopRequireDefault(require("./ui.date_view_roller"));
var _date = _interopRequireDefault(require("../../core/utils/date"));
var _iterator = require("../../core/utils/iterator");
var _extend = require("../../core/utils/extend");
var _ui2 = _interopRequireDefault(require("./ui.date_utils"));
var _component_registrator = _interopRequireDefault(require("../../core/component_registrator"));
var _date2 = _interopRequireDefault(require("../../localization/date"));

function _interopRequireDefault(obj) {
    return obj && obj.__esModule ? obj : {
        default: obj
    }
}
const DATEVIEW_CLASS = "dx-dateview";
const DATEVIEW_COMPACT_CLASS = "dx-dateview-compact";
const DATEVIEW_WRAPPER_CLASS = "dx-dateview-wrapper";
const DATEVIEW_ROLLER_CONTAINER_CLASS = "dx-dateview-rollers";
const DATEVIEW_ROLLER_CLASS = "dx-dateviewroller";
const TYPE = {
    date: "date",
    datetime: "datetime",
    time: "time"
};
const ROLLER_TYPE = {
    year: "year",
    month: "month",
    day: "day",
    hours: "hours"
};
const DateView = _editor.default.inherit({
    _valueOption: function() {
        const value = this.option("value");
        const date = new Date(value);
        return !value || isNaN(date) ? this._getDefaultDate() : date
    },
    _getDefaultDate: function() {
        const date = new Date;
        if (this.option("type") === TYPE.date) {
            return new Date(date.getFullYear(), date.getMonth(), date.getDate())
        }
        return date
    },
    _getDefaultOptions: function() {
        return (0, _extend.extend)(this.callBase(), {
            minDate: _ui2.default.MIN_DATEVIEW_DEFAULT_DATE,
            maxDate: _ui2.default.MAX_DATEVIEW_DEFAULT_DATE,
            type: TYPE.date,
            value: new Date,
            applyCompactClass: false
        })
    },
    _defaultOptionsRules: function() {
        return this.callBase().concat([{
            device: function(device) {
                return "desktop" !== device.deviceType
            },
            options: {
                applyCompactClass: true
            }
        }])
    },
    _render: function() {
        this.callBase();
        this.$element().addClass("dx-dateview");
        this._toggleFormatClasses(this.option("type"));
        this._toggleCompactClass()
    },
    _toggleFormatClasses: function(currentFormat, previousFormat) {
        this.$element().addClass("dx-dateview-" + currentFormat);
        previousFormat && this.$element().removeClass("dx-dateview-" + previousFormat)
    },
    _toggleCompactClass: function() {
        this.$element().toggleClass("dx-dateview-compact", this.option("applyCompactClass"))
    },
    _wrapper: function() {
        return this._$wrapper
    },
    _renderContentImpl: function() {
        this._$wrapper = (0, _renderer.default)("<div>").addClass("dx-dateview-wrapper");
        this._renderRollers();
        this._$wrapper.appendTo(this.$element())
    },
    _renderRollers: function() {
        if (!this._$rollersContainer) {
            this._$rollersContainer = (0, _renderer.default)("<div>").addClass("dx-dateview-rollers")
        }
        this._$rollersContainer.empty();
        this._createRollerConfigs();
        this._rollers = {};
        const that = this;
        (0, _iterator.each)(that._rollerConfigs, (function(name) {
            const $roller = (0, _renderer.default)("<div>").appendTo(that._$rollersContainer).addClass("dx-dateviewroller-" + that._rollerConfigs[name].type);
            that._rollers[that._rollerConfigs[name].type] = that._createComponent($roller, _ui.default, {
                items: that._rollerConfigs[name].displayItems,
                selectedIndex: that._rollerConfigs[name].selectedIndex,
                showScrollbar: "never",
                scrollByContent: true,
                onStart: function(e) {
                    const roller = e.component;
                    roller._toggleActive(true);
                    that._setActiveRoller(that._rollerConfigs[name], roller.option("selectedIndex"))
                },
                onEnd: function(e) {
                    const roller = e.component;
                    roller._toggleActive(false)
                },
                onClick: function(e) {
                    const roller = e.component;
                    roller._toggleActive(true);
                    that._setActiveRoller(that._rollerConfigs[name], roller.option("selectedIndex"));
                    that._setRollerState(that._rollerConfigs[name], roller.option("selectedIndex"));
                    roller._toggleActive(false)
                },
                onSelectedIndexChanged: function(e) {
                    const roller = e.component;
                    that._setRollerState(that._rollerConfigs[name], roller.option("selectedIndex"))
                }
            })
        }));
        that._$rollersContainer.appendTo(that._wrapper())
    },
    _createRollerConfigs: function(type) {
        const that = this;
        type = type || that.option("type");
        that._rollerConfigs = {};
        _date2.default.getFormatParts(_ui2.default.FORMATS_MAP[type]).forEach((function(partName) {
            that._createRollerConfig(partName)
        }))
    },
    _createRollerConfig: function(componentName) {
        const componentInfo = _ui2.default.DATE_COMPONENTS_INFO[componentName];
        const valueRange = this._calculateRollerConfigValueRange(componentName);
        const startValue = valueRange.startValue;
        const endValue = valueRange.endValue;
        const formatter = componentInfo.formatter;
        const curDate = this._getCurrentDate();
        const config = {
            type: componentName,
            setValue: componentInfo.setter,
            valueItems: [],
            displayItems: [],
            getIndex: function(value) {
                return value[componentInfo.getter]() - startValue
            }
        };
        for (let i = startValue; i <= endValue; i++) {
            config.valueItems.push(i);
            config.displayItems.push(formatter(i, curDate))
        }
        config.selectedIndex = config.getIndex(curDate);
        this._rollerConfigs[componentName] = config
    },
    _setActiveRoller: function(currentRoller) {
        const activeRoller = currentRoller && this._rollers[currentRoller.type];
        (0, _iterator.each)(this._rollers, (function() {
            this.toggleActiveState(this === activeRoller)
        }))
    },
    _updateRollersPosition: function() {
        const that = this;
        (0, _iterator.each)(this._rollers, (function(type) {
            const correctIndex = that._rollerConfigs[type].getIndex(that._getCurrentDate());
            this.option("selectedIndex", correctIndex)
        }))
    },
    _setRollerState: function(roller, selectedIndex) {
        if (selectedIndex !== roller.selectedIndex) {
            const rollerValue = roller.valueItems[selectedIndex];
            const setValue = roller.setValue;
            let currentValue = new Date(this._getCurrentDate());
            let currentDate = currentValue.getDate();
            const minDate = this.option("minDate");
            const maxDate = this.option("maxDate");
            if (roller.type === ROLLER_TYPE.month) {
                currentDate = Math.min(currentDate, _ui2.default.getMaxMonthDay(currentValue.getFullYear(), rollerValue))
            } else if (roller.type === ROLLER_TYPE.year) {
                currentDate = Math.min(currentDate, _ui2.default.getMaxMonthDay(rollerValue, currentValue.getMonth()))
            }
            currentValue.setDate(currentDate);
            currentValue[setValue](rollerValue);
            const normalizedDate = _date.default.normalizeDate(currentValue, minDate, maxDate);
            currentValue = _ui2.default.mergeDates(normalizedDate, currentValue, "time");
            currentValue = _date.default.normalizeDate(currentValue, minDate, maxDate);
            this.option("value", currentValue);
            roller.selectedIndex = selectedIndex
        }
        if (roller.type === ROLLER_TYPE.year) {
            this._refreshRollers()
        }
        if (roller.type === ROLLER_TYPE.month) {
            this._refreshRoller(ROLLER_TYPE.day);
            this._refreshRoller(ROLLER_TYPE.hours)
        }
    },
    _refreshRoller: function(rollerType) {
        const roller = this._rollers[rollerType];
        if (roller) {
            this._createRollerConfig(rollerType);
            const rollerConfig = this._rollerConfigs[rollerType];
            if (rollerType === ROLLER_TYPE.day || rollerConfig.displayItems.toString() !== roller.option("items").toString()) {
                roller.option({
                    items: rollerConfig.displayItems,
                    selectedIndex: rollerConfig.selectedIndex
                })
            }
        }
    },
    _getCurrentDate: function() {
        const curDate = this._valueOption();
        const minDate = this.option("minDate");
        const maxDate = this.option("maxDate");
        return _date.default.normalizeDate(curDate, minDate, maxDate)
    },
    _calculateRollerConfigValueRange: function(componentName) {
        const curDate = this._getCurrentDate();
        const minDate = this.option("minDate");
        const maxDate = this.option("maxDate");
        const minYear = _date.default.sameYear(curDate, minDate);
        const minMonth = minYear && curDate.getMonth() === minDate.getMonth();
        const maxYear = _date.default.sameYear(curDate, maxDate);
        const maxMonth = maxYear && curDate.getMonth() === maxDate.getMonth();
        const minHour = minMonth && curDate.getDate() === minDate.getDate();
        const maxHour = maxMonth && curDate.getDate() === maxDate.getDate();
        const componentInfo = _ui2.default.DATE_COMPONENTS_INFO[componentName];
        let startValue = componentInfo.startValue;
        let endValue = componentInfo.endValue;
        if (componentName === ROLLER_TYPE.year) {
            startValue = minDate.getFullYear();
            endValue = maxDate.getFullYear()
        }
        if (componentName === ROLLER_TYPE.month) {
            if (minYear) {
                startValue = minDate.getMonth()
            }
            if (maxYear) {
                endValue = maxDate.getMonth()
            }
        }
        if (componentName === ROLLER_TYPE.day) {
            endValue = _ui2.default.getMaxMonthDay(curDate.getFullYear(), curDate.getMonth());
            if (minYear && minMonth) {
                startValue = minDate.getDate()
            }
            if (maxYear && maxMonth) {
                endValue = maxDate.getDate()
            }
        }
        if (componentName === ROLLER_TYPE.hours) {
            startValue = minHour ? minDate.getHours() : startValue;
            endValue = maxHour ? maxDate.getHours() : endValue
        }
        return {
            startValue: startValue,
            endValue: endValue
        }
    },
    _refreshRollers: function() {
        this._refreshRoller(ROLLER_TYPE.month);
        this._refreshRoller(ROLLER_TYPE.day);
        this._refreshRoller(ROLLER_TYPE.hours)
    },
    _optionChanged: function(args) {
        switch (args.name) {
            case "minDate":
            case "maxDate":
            case "type":
                this._renderRollers();
                this._toggleFormatClasses(args.value, args.previousValue);
                break;
            case "visible":
                this.callBase(args);
                if (args.value) {
                    this._renderRollers()
                }
                break;
            case "value":
                this.option("value", this._valueOption());
                this._refreshRollers();
                this._updateRollersPosition();
                break;
            default:
                this.callBase(args)
        }
    },
    _clean: function() {
        this.callBase();
        delete this._$rollersContainer
    }
});
(0, _component_registrator.default)("dxDateView", DateView);
var _default = DateView;
exports.default = _default;
module.exports = exports.default;
module.exports.default = exports.default;
