import type { IntakeStatus } from '@/lib/intake/transitions'

export type IntakeForPromote = {
  id: string
  status: IntakeStatus
  intake_id: string
  intake_type: string | null
  supplier_id: string | null
  supplier_name_freetext: string | null
  supplier_plant_location: string | null
  project_lead: string | null
  delivery_scope: string | null
  requesting_department: string | null
  product_line: string | null
  vehicle_project: string | null
  order_reason: string | null
  order_objective: string | null
  preferred_first_visit_start: string | null
  preferred_first_visit_end: string | null
}

export type PromoteFormInput = {
  consultantId: string
  erstbesuchStart: string
  erstbesuchEnd: string
  supplierNameOverride: string | null
  plantLocationOverride: string | null
}

export type PromoteValidationError =
  | 'intake_not_promotable_status'
  | 'consultant_required'
  | 'erstbesuch_start_required'
  | 'erstbesuch_end_required'
  | 'erstbesuch_end_before_start'
  | 'supplier_required'

export function validatePromoteInput(
  intake: IntakeForPromote,
  input: PromoteFormInput,
): { ok: true } | { ok: false; error: PromoteValidationError } {
  if (intake.status !== 'backlog' && intake.status !== 'review') {
    return { ok: false, error: 'intake_not_promotable_status' }
  }
  if (!input.consultantId) return { ok: false, error: 'consultant_required' }
  if (!input.erstbesuchStart) return { ok: false, error: 'erstbesuch_start_required' }
  if (!input.erstbesuchEnd) return { ok: false, error: 'erstbesuch_end_required' }
  if (input.erstbesuchEnd < input.erstbesuchStart) {
    return { ok: false, error: 'erstbesuch_end_before_start' }
  }

  const supplierResolved =
    intake.supplier_id ||
    (input.supplierNameOverride && input.supplierNameOverride.trim().length > 0) ||
    (intake.supplier_name_freetext && intake.supplier_name_freetext.trim().length > 0)

  if (!supplierResolved) return { ok: false, error: 'supplier_required' }

  return { ok: true }
}

const INTAKE_TYPE_TO_PROJECT_TYPE_CODE: Record<string, string> = {
  lsc_workshop: 'lsc_workshop',
  fabrikanalyse: 'fabrikanalyse',
}

export function mapIntakeTypeToProjectTypeCode(intakeType: string | null): string | null {
  if (!intakeType) return null
  return INTAKE_TYPE_TO_PROJECT_TYPE_CODE[intakeType] ?? null
}

export function deriveKifagDepartmentPrefix(requestingDepartment: string | null): string | null {
  if (!requestingDepartment) return null
  const idx = requestingDepartment.indexOf('-')
  if (idx <= 0) return null
  return requestingDepartment.slice(0, idx)
}
