import { z } from 'zod'
import {
  COMPLETE_HOSPITALIZATION_CONVERSION,
  CONFIRMATION_OVERRIDE,
  EMERGENCY_PASSAGE,
  HOSPITAL_RESTRICTED_RESERVE_CARE,
  INNOVATION_NUMBER,
  NON_PROGRAMMED,
  RAAC_CARE,
  RADIO_THERAPY_DOSIMETRY_TYPE,
  RADIO_THERAPY_MACHINE_TYPE,
  RUM_DESTINATION,
  RUM_ENTRY_MODE,
  RUM_EXIT_MODE,
  RUM_PROVENANCE,
  SEX,
  SPECIAL_PATIENT_MONITORING,
  TARIFFICATION_RESTRICTION,
  TOTAL_INTERVENTIONS_CATEGORY
} from './rum.enums'

export const ZASectionSchema = z.object({
  date: z.string().length(8), // DDMMYYYY
  code: z.string().length(8),
  ext: z.string().length(3).optional(),
  phase: z.string().length(1).optional(),
  act: z.string().length(1).optional(),
  diag: z.string().length(2).optional(),
  mod: z.string().length(4).optional(),
  RE: z.string().length(1).optional(),
  AN: z.string().length(1).optional(),
  qty: z.string().length(2).optional()
})

export const RUMObjectSchema = z.object({
  // Identification
  FINESS: z.string().length(9).optional(),
  RSS: z.string().length(20).optional(),

  // Données administratives
  ADM: z.string().length(8).optional(),
  RUM: z.string().length(8).optional(),
  birthDate: z.string().length(8).optional(),
  sex: z.nativeEnum(SEX).optional(), // 1 = Male, 2 = Female
  uMed: z.string().length(8).optional(),
  authorisation: z.string().length(2).optional(),

  // Dates et modes
  entryDate: z.string().length(8).optional(),
  entryMode: z.nativeEnum(RUM_ENTRY_MODE).optional(), // Selon modalités du document
  provenance: z.nativeEnum(RUM_PROVENANCE).optional(), // Selon modalités du document
  exitDate: z.string().length(8).optional(),
  exitMode: z.nativeEnum(RUM_EXIT_MODE).optional(),
  destination: z.nativeEnum(RUM_DESTINATION).optional(),

  // Données géographiques et cliniques
  cpRes: z.string().length(5).optional(),
  weight: z.string().length(4).optional(), // Decimal format 0000
  ageGestation: z.string().length(2).optional(),
  lastMensDate: z.string().length(8).optional(),
  session: z.number().min(0).max(99).optional(),

  // Compteurs
  nDA: z.number().min(0).max(99).optional(), // 2 caractères selon document
  nDAD: z.number().min(0).max(99).optional(), // 2 caractères selon document
  nZA: z.number().min(0).max(999).optional(), // 3 caractères selon document

  // Diagnostics
  DP: z.string().length(8).optional(),
  DR: z.string().length(8).optional(),

  // Scores et codes
  IGS: z.string().optional(),
  conf: z.nativeEnum(CONFIRMATION_OVERRIDE).optional(),

  // Codes de radiothérapie
  rtM: z.nativeEnum(RADIO_THERAPY_MACHINE_TYPE).optional(),
  rtD: z.nativeEnum(RADIO_THERAPY_DOSIMETRY_TYPE).optional(),

  // Codes spéciaux
  innov: z.nativeEnum(INNOVATION_NUMBER).optional(),
  conv: z.nativeEnum(COMPLETE_HOSPITALIZATION_CONVERSION).optional(),
  raac: z.nativeEnum(RAAC_CARE).optional(),
  spec: z.nativeEnum(SPECIAL_PATIENT_MONITORING).optional(),
  RH: z.nativeEnum(HOSPITAL_RESTRICTED_RESERVE_CARE).optional(),
  tarif: z.nativeEnum(TARIFFICATION_RESTRICTION).optional(),
  cat: z.nativeEnum(TOTAL_INTERVENTIONS_CATEGORY).optional(),

  // Urgences
  NP: z.nativeEnum(NON_PROGRAMMED).optional(),
  ER: z.nativeEnum(EMERGENCY_PASSAGE).optional(),

  // Champs texte
  FILL: z.string().optional(),
  RES: z.string().optional(),

  // Tableaux
  DAs: z.array(z.string().length(8)).optional(),
  DADs: z.array(z.string().length(8)).optional(),
  ZAs: z.array(ZASectionSchema).optional()
})

export type ZASection = z.infer<typeof ZASectionSchema>

export type RUMObject = z.infer<typeof RUMObjectSchema>
