"use strict";
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
const event = require("../../../constants/event.js");
const shared_esmBundler = require("../../../../../@vue/shared/dist/shared.esm-bundler.js");
const error = require("../../../utils/error.js");
const index = require("../../../hooks/use-locale/index.js");
const Vue = require("vue");
const dayjs_min = require("../../../../../../_virtual/dayjs.min.js");
const adjacentMonth = (start, end) => {
  const firstMonthLastDay = start.endOf("month");
  const lastMonthFirstDay = end.startOf("month");
  const lastMonthStartDay = firstMonthLastDay.isSame(lastMonthFirstDay, "week") ? lastMonthFirstDay.add(1, "week") : lastMonthFirstDay;
  return [[start, firstMonthLastDay], [lastMonthStartDay.startOf("week"), end]];
};
const threeConsecutiveMonth = (start, end) => {
  const firstMonthLastDay = start.endOf("month");
  const secondMonthFirstDay = start.add(1, "month").startOf("month");
  const secondMonthStartDay = firstMonthLastDay.isSame(secondMonthFirstDay, "week") ? secondMonthFirstDay.add(1, "week") : secondMonthFirstDay;
  const secondMonthLastDay = secondMonthStartDay.endOf("month");
  const lastMonthFirstDay = end.startOf("month");
  const lastMonthStartDay = secondMonthLastDay.isSame(lastMonthFirstDay, "week") ? lastMonthFirstDay.add(1, "week") : lastMonthFirstDay;
  return [
    [start, firstMonthLastDay],
    [secondMonthStartDay.startOf("week"), secondMonthLastDay],
    [lastMonthStartDay.startOf("week"), end]
  ];
};
const useCalendar = (props, emit, componentName) => {
  const { lang } = index.useLocale();
  const selectedDay = Vue.ref();
  const now = dayjs_min.default().locale(lang.value);
  const realSelectedDay = Vue.computed({
    get() {
      if (!props.modelValue) return selectedDay.value;
      return date.value;
    },
    set(val) {
      if (!val) return;
      selectedDay.value = val;
      const result = val.toDate();
      emit(event.INPUT_EVENT, result);
      emit(event.UPDATE_MODEL_EVENT, result);
    }
  });
  const validatedRange = Vue.computed(() => {
    if (!props.range || !shared_esmBundler.isArray(props.range) || props.range.length !== 2 || props.range.some((item) => !shared_esmBundler.isDate(item))) return [];
    const [startDayjs, endDayjs] = props.range.map((_) => dayjs_min.default(_).locale(lang.value));
    if (startDayjs.isAfter(endDayjs)) {
      error.debugWarn(componentName, "end time should be greater than start time");
      return [];
    }
    if (startDayjs.isSame(endDayjs, "month")) return calculateValidatedDateRange(startDayjs, endDayjs);
    else {
      if (startDayjs.add(1, "month").month() !== endDayjs.month()) {
        error.debugWarn(componentName, "start time and end time interval must not exceed two months");
        return [];
      }
      return calculateValidatedDateRange(startDayjs, endDayjs);
    }
  });
  const date = Vue.computed(() => {
    if (!props.modelValue) return realSelectedDay.value || (validatedRange.value.length ? validatedRange.value[0][0] : now);
    else return dayjs_min.default(props.modelValue).locale(lang.value);
  });
  const prevMonthDayjs = Vue.computed(() => date.value.subtract(1, "month").date(1));
  const nextMonthDayjs = Vue.computed(() => date.value.add(1, "month").date(1));
  const prevYearDayjs = Vue.computed(() => date.value.subtract(1, "year").date(1));
  const nextYearDayjs = Vue.computed(() => date.value.add(1, "year").date(1));
  const calculateValidatedDateRange = (startDayjs, endDayjs) => {
    const firstDay = startDayjs.startOf("week");
    const lastDay = endDayjs.endOf("week");
    const firstMonth = firstDay.get("month");
    const lastMonth = lastDay.get("month");
    if (firstMonth === lastMonth) return [[firstDay, lastDay]];
    else if ((firstMonth + 1) % 12 === lastMonth) return adjacentMonth(firstDay, lastDay);
    else if (firstMonth + 2 === lastMonth || (firstMonth + 1) % 11 === lastMonth) return threeConsecutiveMonth(firstDay, lastDay);
    else {
      error.debugWarn(componentName, "start time and end time interval must not exceed two months");
      return [];
    }
  };
  const pickDay = (day) => {
    realSelectedDay.value = day;
  };
  const selectDate = (type) => {
    const day = {
      "prev-month": prevMonthDayjs.value,
      "next-month": nextMonthDayjs.value,
      "prev-year": prevYearDayjs.value,
      "next-year": nextYearDayjs.value,
      today: now
    }[type];
    if (!day.isSame(date.value, "day")) pickDay(day);
  };
  const handleDateChange = (date2) => {
    if (date2 === "today") selectDate("today");
    else pickDay(date2);
  };
  return {
    calculateValidatedDateRange,
    date,
    realSelectedDay,
    pickDay,
    selectDate,
    validatedRange,
    handleDateChange
  };
};
exports.useCalendar = useCalendar;
