// @ts-nocheck
import { WeekRange, DateType } from './type'

/**
 * 获取指定日期所在周的日期范围。
 * @param {Date} date - 指定日期。
 * @param {number} firstDayOfWeek - 一周的第一天，0 表示周日，1 表示周一，以此类推。
 * @returns {WeekRange} 返回一个包含周起始和结束日期的对象。
 */

export function getWeekRange(date: Date, firstDayOfWeek: number): WeekRange {
    const start = new Date(date.getTime())
    const dayOffset = (date.getDay() - firstDayOfWeek + 7) % 7
    start.setDate(start.getDate() - dayOffset)

    const end = new Date(start.getTime())
    end.setDate(end.getDate() + 6)
    return { start, end } as WeekRange
}

/**
 * 向指定日期添加天数。
 * @param {Date} date - 基础日期。
 * @param {number} days - 要添加的天数，可以是正数或负数。
 * @returns {Date} 返回一个新的日期对象，该对象是基础日期加上指定天数后的结果。
 */
export function addDays(date: Date, days: number): Date {
    const result = new Date(date.getTime())
    result.setDate(result.getDate() + days)
    return result
}

export function addWeeks(date: Date, weeks: number): Date {
    const result = new Date(date.getTime())
    result.setDate(result.getDate() + weeks * 7)
    return result
}

/**
 * 判断两个日期是否表示同一天（忽略时间部分）。
 *
 * @param date1 - 第一个日期。
 * @param date2 - 第二个日期。
 * @returns 如果两个日期是同一天，返回 true；否则返回 false。
 */
function isSameDate(date1: Date, date2: Date): boolean {
    return (
        date1.getFullYear() == date2.getFullYear() &&
        date1.getMonth() == date2.getMonth() &&
        date1.getDate() == date2.getDate()
    )
}
export function calcType(
    date: Date,
    minDate: Date,
    maxDate: Date,
    selectedDate: Date | null
): DateType {
    // 检查日期是否早于 minDate 或晚于 maxDate
    if (date.getTime() < minDate.getTime() || date.getTime() > maxDate.getTime()) {
        return 'disabled'
    }
    // 如果 selectedDate 不为 null，检查日期是否等于 selectedDate
    if (selectedDate != null && isSameDate(date, selectedDate)) {
        return 'selected'
    }
    return ''
}

export function daysBetween(date1: Date, date2: Date): number {
    // 将两个日期转换为毫秒
    const diffInMilliseconds = Math.abs(date2.getTime() - date1.getTime())
    return Math.floor(diffInMilliseconds / (1000 * 3600 * 24))
}
