import { ComponentPublicInstance } from 'vue';

// 日历模式类型
export type CalendarMode = 'year' | 'month' | 'week' | 'day';

// 日期信息接口
export interface DateInfo {
  date: Date;
  day: number;
  month: number;
  year: number;
  isCurrentMonth: boolean;
  isToday: boolean;
  isSelected: boolean;
  isInRange?: boolean;
  isRangeStart?: boolean;
  isRangeEnd?: boolean;
  isHoliday?: boolean;
  isWeekend?: boolean;
  isCheckedIn?: boolean;
  isRestDay?: boolean;
  isHolidayPeriod?: boolean; // 是否在法定节假日期间（区别于普通节日）
  isDisabled?: boolean; // 是否禁用
  price?: number;
  lunarDay?: string;
  lunarMonth?: string;
  lunarYear?: string;
  lunarFestival?: string;
  solarFestival?: string;
  solarTerm?: string;
}

// 价格数据接口
export interface PriceData {
  [date: string]: number;
}

// 打卡数据类型
export type CheckInData = Record<string, boolean>;

// 日历组件属性接口
export interface CalendarProps {
  modelValue: Date | [Date, Date];
  mode: CalendarMode;
  showLunar: boolean;
  showHoliday: boolean;
  showPrice: boolean;
  priceData: PriceData;
  checkInData: CheckInData;
  rangeMode: boolean;
  hotelMode: boolean;
  firstDayOfWeek: 0 | 1; // 0 表示周日为一周的第一天，1 表示周一为一周的第一天
  disabledDate?: (date: Date) => boolean; // 禁用日期的函数
  highlightWeekend: boolean;
  autoHeight: boolean;
}

// 日历组件实例类型
export type CalendarInstance = ComponentPublicInstance<CalendarProps, {
  // 组件方法
  goToDate: (date: Date) => void;
  goToToday: () => void;
  goToNextMonth: () => void;
  goToPrevMonth: () => void;
  goToNextYear: () => void;
  goToPrevYear: () => void;
  checkIn: (date: Date) => void;
}>;

// 农历信息接口
export interface LunarInfo {
  lunarDay: string;
  lunarMonth: string;
  lunarYear: string;
  lunarFestival?: string;
  solarFestival?: string;
  solarTerm?: string;
}

// 节假日信息接口
export interface HolidayInfo {
  name: string;
  isRestDay: boolean;
  isHolidayPeriod?: boolean; // 是否在法定节假日期间
  isHoliday?: boolean; // 是否是节假日
}

// 节假日数据接口
export interface HolidayData {
  [date: string]: HolidayInfo;
}