import type { Employee } from './employee'
import type { ContractType, TrackingMode } from './contract'

export type WorkHour = {
  id: number
  employee: Employee
  workDate: string
  morningFrom?: string | null
  morningTo?: string | null
  afternoonFrom?: string | null
  afternoonTo?: string | null
  eveningFrom?: string | null
  eveningTo?: string | null
  isPresentMorning?: boolean
  isPresentAfternoon?: boolean
  dayHoursMinutes?: number | null
  nightHoursMinutes?: number | null
  workshopHoursMinutes?: number | null
  hasBreakfast?: boolean
  hasLunch?: boolean
  hasDinner?: boolean
  hasOvernight?: boolean
  isSiteValid?: boolean
  isValid?: boolean
  updatedAt?: string | null
}

export type WorkHourEntryPayload = {
  employeeId: number
  morningFrom?: string | null
  morningTo?: string | null
  afternoonFrom?: string | null
  afternoonTo?: string | null
  eveningFrom?: string | null
  eveningTo?: string | null
  isPresentMorning?: boolean
  isPresentAfternoon?: boolean
  dayHoursMinutes?: number | null
  nightHoursMinutes?: number | null
  workshopHoursMinutes?: number | null
  hasBreakfast?: boolean
  hasLunch?: boolean
  hasDinner?: boolean
  hasOvernight?: boolean
  // Autorise la suppression d'une ligne existante quand l'entrée est vide.
  // Sans ce flag, le backend ignore une entrée vide sur une ligne existante
  // (garde anti-perte de données contre les grilles périmées).
  delete?: boolean
}

export type WeeklyWorkHourDailySummary = {
  date: string
  dayMinutes: number
  nightMinutes: number
  workshopMinutes?: number
  totalMinutes: number
  present?: number | null
  hasAbsence?: boolean
  absenceLabel?: string | null
  absenceColor?: string | null
  hasNightBasket?: boolean
  hasBreakfast?: boolean
  hasLunch?: boolean
  hasDinner?: boolean
  hasOvernight?: boolean
  virtualHolidayMinutes?: number
  holidayLabel?: string | null
}

export type WeeklyWorkHourRowSummary = {
  employeeId: number
  firstName: string
  lastName: string
  siteName?: string | null
  contractName?: string | null
  contractType?: ContractType | null
  trackingMode?: TrackingMode | null
  daily: WeeklyWorkHourDailySummary[]
  weeklyDayMinutes: number
  weeklyNightMinutes: number
  weeklyWorkshopMinutes?: number
  weeklyTotalMinutes: number
  weeklyPresenceCount?: number
  weeklyOvertimeTotalMinutes?: number
  weeklyOvertime25Minutes?: number
  weeklyOvertime50Minutes?: number
  weeklyRecoveryMinutes?: number
  weeklyNightBasketCount?: number
  isDriver?: boolean
  weeklyBreakfastCount?: number
  weeklyLunchCount?: number
  weeklyDinnerCount?: number
  weeklyOvernightCount?: number
  hasContractForWeek?: boolean
  contractNature?: 'CDI' | 'CDD' | 'INTERIM' | null
  comment?: string | null
  commentId?: number | null
}

export type WeeklyWorkHourSummary = {
  weekStart: string
  weekEnd: string
  days: string[]
  rows: WeeklyWorkHourRowSummary[]
}

export type WorkHourDayContextRow = {
  employeeId: number
  hasContractAtDate: boolean
  absenceLabel?: string | null
  absenceColor?: string | null
  absenceHalf?: 'AM' | 'PM' | null
  absentMorning: boolean
  absentAfternoon: boolean
  creditedMinutes: number
  creditedPresenceUnits: number
  isDriverContract?: boolean
  hasFormation?: boolean
  formationLabel?: string | null
  virtualHolidayMinutes?: number
  contractNature?: 'CDI' | 'CDD' | 'INTERIM' | null
  trackingMode?: TrackingMode | null
  weeklyHours?: number | null
  contractType?: ContractType | null
  contractName?: string | null
  workDaysHours?: Record<number, number> | null
}

export type WorkHourDayContext = {
  workDate: string
  rows: WorkHourDayContextRow[]
}

export type DriverHourRow = {
  workHourId: number | null
  dayHours: string
  nightHours: string
  workshopHours: string
  hasBreakfast: boolean
  hasLunch: boolean
  hasDinner: boolean
  hasOvernight: boolean
  isSiteValid: boolean
  isValid: boolean
  updatedAt: string | null
}
