import dayjs from 'dayjs';
import { isoWeekday } from '../_util/dayjs/iso-weekday';
export function getMonthListFromRange(start, end) {
    if (start.isAfter(end))
        throw new Error("Start time can't be later than end time.");
    var result = [];
    var current = start.date(1);
    while (!current.isAfter(end)) {
        result.push(current.date(1));
        current = current.add(1, 'month');
    }
    return result;
}
export function defaultMonthRange() {
    var start = dayjs().startOf('date');
    var end = dayjs().startOf('date').add(2, 'month');
    return [start.toDate().getTime(), end.toDate().getTime()];
}
/**
 *
 * @param month 月份的某一天
 * @param weekStartsOn 日历以星期几开始
 * @returns 获取当月日历所有的日子
 */
export function getDate(month, weekStartsOn) {
    var startOfMonth = month.date(1);
    var cells = [];
    var iterator = startOfMonth
        .subtract(isoWeekday(startOfMonth) % 7, 'day')
        .startOf('day');
    if (weekStartsOn === 'Monday') {
        iterator = iterator.add(1, 'day');
        if (iterator.isSame(startOfMonth, 'month') &&
            !iterator.isSame(startOfMonth.startOf('date'), 'date')) {
            iterator = iterator.add(-7, 'days');
        }
    }
    var diffDay = startOfMonth.date(1).add(1, 'month').diff(iterator, 'day');
    var lintCount = Math.ceil(diffDay / 7);
    while (cells.length < lintCount * 7) {
        cells.push(iterator);
        iterator = iterator.add(1, 'day');
    }
    return cells;
}
export function renderCells(cellsMonth, weekStartsOn, value, localeText) {
    var _a;
    var rowBeginDay = 0;
    var rowEndDay = 6;
    if (weekStartsOn === 'Monday') {
        rowBeginDay = 1;
        rowEndDay = 0;
    }
    var dates = getDate(cellsMonth, weekStartsOn);
    if (!value) {
        return dates.map(function (d) {
            var isToday = dayjs().isSame(d, 'day');
            var isRowBegin = d.isSame(cellsMonth.startOf('month'), 'date') ||
                d.day() === rowBeginDay;
            var isRowEnd = d.isSame(cellsMonth.endOf('month'), 'date') || d.day() === rowEndDay;
            var top;
            if (isToday) {
                top = {
                    label: localeText.today,
                };
            }
            return {
                disabled: false,
                time: d.toDate().getTime(),
                date: d.get('date'),
                isSelected: false,
                isSelectedBegin: false,
                top: top,
                isSelectedEnd: false,
                inThisMonth: d.month() === cellsMonth.month(),
                isRowBegin: isRowBegin,
                isRowEnd: isRowEnd,
            };
        });
    }
    var selectBegin;
    var selectEnd;
    if (Array.isArray(value)) {
        selectBegin = dayjs(value[0]);
        selectEnd = dayjs((_a = value[1]) !== null && _a !== void 0 ? _a : value[0]);
    }
    else {
        selectBegin = dayjs(value);
        selectEnd = dayjs(value);
    }
    return dates.map(function (d) {
        var isToday = dayjs().isSame(d, 'day');
        var isRowBegin = d.isSame(cellsMonth.startOf('month'), 'date') || d.day() === rowBeginDay;
        var isRowEnd = d.isSame(cellsMonth.endOf('month'), 'date') || d.day() === rowEndDay;
        var isSelectedBegin = selectBegin.isSame(d, 'day');
        var isSelectedEnd = selectEnd.isSame(d, 'day');
        var isSelected = (!!selectBegin.isBefore(d, 'day') && !!selectEnd.isAfter(d, 'day')) ||
            isSelectedBegin ||
            isSelectedEnd;
        var inThisMonth = d.month() === cellsMonth.month();
        var time = d.toDate().getTime();
        var topLabel = isToday ? localeText.today : '';
        if (Array.isArray(value)) {
            if (isSelectedBegin) {
                if (isSelectedEnd && value.length === 2) {
                    topLabel = localeText.startAndEnd;
                }
                else {
                    topLabel = localeText.start;
                }
            }
            else {
                if (isSelectedEnd) {
                    topLabel = localeText.end;
                }
            }
        }
        return {
            disabled: false,
            time: time,
            date: d.get('date'),
            isSelected: isSelected,
            isSelectedBegin: isSelectedBegin,
            top: { label: topLabel },
            isSelectedEnd: isSelectedEnd,
            inThisMonth: inThisMonth,
            isRowBegin: isRowBegin,
            isRowEnd: isRowEnd,
        };
    });
}
export function getSelectionModeFromValue(value) {
    if (Array.isArray(value)) {
        return 'range';
    }
    if (typeof value === 'number') {
        return 'single';
    }
    return null;
}