import type { Assignment, Consultant } from './planning-types'

/** Parse "HH:MM" or "HH:MM:SS" into fractional hours */
function parseTime(t: string): number {
  const [h, m] = t.split(':').map(Number)
  return h + m / 60
}

/** Hours booked by a single assignment. */
export function assignmentHours(a: Assignment, capacityHours: number): number {
  if (a.is_all_day) return capacityHours
  if (a.start_time && a.end_time) {
    const h = parseTime(a.end_time) - parseTime(a.start_time)
    return Math.max(0, h)
  }
  return capacityHours  // unknown duration → assume full day
}

export interface CapacityCell {
  bookedHours: number
  capacityHours: number
  overbooked: boolean
}

/**
 * Build a map of "consultantId:YYYY-MM-DD" → CapacityCell.
 * Only entries that have any assignments are included.
 */
export function buildCapacityMap(
  assignments: Assignment[],
  consultants: Consultant[],
): Map<string, CapacityCell> {
  const capacityByConsultant = new Map(
    consultants.map((c) => [c.id, Number(c.capacity_hours_per_day)]),
  )

  // Group by (consultant, date)
  const hoursByCell = new Map<string, number>()
  for (const a of assignments) {
    const key = `${a.consultant_id}:${a.date}`
    const cap = capacityByConsultant.get(a.consultant_id) ?? 8
    hoursByCell.set(key, (hoursByCell.get(key) ?? 0) + assignmentHours(a, cap))
  }

  const result = new Map<string, CapacityCell>()
  for (const [key, booked] of hoursByCell) {
    const [consultantId] = key.split(':')
    const cap = capacityByConsultant.get(consultantId) ?? 8
    result.set(key, {
      bookedHours:   booked,
      capacityHours: cap,
      overbooked:    booked > cap,
    })
  }
  return result
}

/**
 * True if the assignment is flagged as travel OR has a non-empty location
 * that differs from the consultant's team home (heuristic: any location = travel).
 * Explicit requires_travel flag always wins.
 */
export function isTravelAssignment(a: Assignment): boolean {
  return a.requires_travel || (!!a.location_label && a.work_mode !== 'homeoffice')
}
