import type { LayerApplicability } from '@/shared/api/types'

/**
 * Действует ли слой в эту дату вещательных суток. Зеркало серверного `LayerApplicability.Covers`
 * (`TeleWave.Application/Programming/Templates/LayerApplicability.cs`) — источник правды там,
 * здесь только подсветка сетки. Меняя одно, правьте второе.
 */
export function coversDate(applicability: LayerApplicability | null, date: Date): boolean {
  if (!applicability || isEmpty(applicability)) return true

  const weekday = date.getDay()
  if (applicability.weekdays?.includes(weekday)) return true

  const iso = toIsoDate(date)
  if (applicability.specificDates?.includes(iso)) return true

  if (applicability.dateRanges?.some((r) => iso >= r.from && iso <= r.to)) return true

  // Ежегодный период может пересекать Новый год — сравниваем по паре (месяц, день).
  const value = (date.getMonth() + 1) * 100 + date.getDate()
  return (
    applicability.annualRanges?.some((r) => {
      const from = r.fromMonth * 100 + r.fromDay
      const to = r.toMonth * 100 + r.toDay
      return from <= to ? value >= from && value <= to : value >= from || value <= to
    }) ?? false
  )
}

export function isEmpty(applicability: LayerApplicability | null): boolean {
  if (!applicability) return true
  return (
    !applicability.weekdays?.length &&
    !applicability.dateRanges?.length &&
    !applicability.annualRanges?.length &&
    !applicability.specificDates?.length
  )
}

/** «2026-12-25» из локальной даты — без ухода в UTC, иначе вечер уезжает на день назад. */
export function toIsoDate(date: Date): string {
  return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(
    date.getDate(),
  ).padStart(2, '0')}`
}
