/**
 *获取当前日期是某年的第几周（周一为一周开始）
 * @param year - 指定的年份
 * @returns 当前是第几周（如果当前年份小于参数年份返回0）
 */
export function getWeekOfYear(year?: number): number {
  const now: Date = new Date();
  const _year = year ?? now.getFullYear();
  // 检查年份
  if (now.getFullYear() < _year) {
    return 0;
  }
  if (now.getFullYear() > _year) {
    return getWeeksInYear(_year);
  }

  return getWeekNumber(now, _year);
}

/**
 *计算指定日期是该年的第几周（周一为一周开始）
 * @param date - 要计算的日期
 * @param year - 指定的年份
 * @returns 第几周
 */
export function getWeekNumber(date: Date, year: number): number {
  // 获取该年1月1日
  const janFirst: Date = new Date(year, 0, 1);

  // 计算1月1日是周几（0=周日，1=周一...6=周六）
  const firstDay: number = janFirst.getDay();

  // 计算第一周的天数（如果1月1日不是周一）
  let firstWeekDays = 0;
  if (firstDay !== 1) {
    firstWeekDays = firstDay === 0 ? 1 : 8 - firstDay;
  }

  // 计算当前日期距离1月1日的天数（加1因为1月1日是第1天）
  const diffDays: number = Math.floor((date.getTime() - janFirst.getTime()) / (24 * 60 * 60 * 1000)) + 1;

  // 如果日期在第一周调整前的天数内，属于第0周
  if (diffDays <= 0) {
    return 0;
  }

  // 如果日期在第一周内
  if (diffDays <= firstWeekDays) {
    return firstWeekDays > 0 ? 1 : 0;
  }

  // 计算完整周数
  return Math.ceil((diffDays - firstWeekDays) / 7);
}

/**
 *获取某年的总周数
 * @param year - 指定的年份
 * @returns 该年的总周数
 */
export function getWeeksInYear(year: number): number {
  const dec31: Date = new Date(year, 11, 31);
  return getWeekNumber(dec31, year);
}

/**
 * 得到日期时间信息
 */
export function getDateObj(dateObj: Date | number | string = new Date()) {
  const date = dateObj instanceof Date ? dateObj : new Date(dateObj);
  const year = String(date.getFullYear());
  let month = String(date.getMonth() + 1);
  month = month.length > 1 ? month : `0${month}`;
  let day = String(date.getDate());
  day = day.length > 1 ? day : `0${day}`;
  let hour = String(date.getHours());
  hour = hour.length > 1 ? hour : `0${hour}`;
  let minute = String(date.getMinutes());
  minute = minute.length > 1 ? minute : `0${minute}`;
  let second = String(date.getSeconds());
  second = second.length > 1 ? second : `0${second}`;

  return { year, month, day, hour, minute, second, timestamp: date.getTime() };
}

/**
 * 根据毫秒数得到是几分几秒 (例如: 60000 -> {  minute:'01', second:'00' })
 */
export function formatCountDown2Minute(timestamp: number) {
  const totalSeconds = Math.floor(timestamp / 1000);
  const minutes = Math.floor((totalSeconds % 3600) / 60);
  const remainingSeconds = totalSeconds % 60;

  const pad = (num: number) => num.toString().padStart(2, '0');
  return { minute: pad(minutes), second: pad(remainingSeconds) };
}

/**
 * 根据毫秒数得到是几时几分几秒 (例如: 60000 -> {   hour:'00', minute:'01', second:'00' })
 */
export function formatCountDown2Hour(timestamp: number) {
  const totalSeconds = Math.floor(timestamp / 1000);
  const hour = Math.floor(totalSeconds / 3600);
  const minute = Math.floor((totalSeconds % 3600) / 60);
  const second = totalSeconds % 60;

  const pad = (num: number) => num.toString().padStart(2, '0');
  return { hour: pad(hour), minute: pad(minute), second: pad(second) };
}

/**
 * 等待指定时间
 */
export function sleep(time: number): Promise<void> {
  return new Promise((resolve) => {
    setTimeout(resolve, time);
  });
}
