
export interface Rect {
  x: number;
  y: number;
  w: number;
  h: number;
}

export interface Zone extends Rect {
  id: string;
  label: string;
}

export interface TemplateConfig {
  [key: string]: Zone;
}

export interface TextItem {
  str: string;
  x: number;
  y: number;
  width: number;
  height: number;
}

export interface ExtractionResult {
  pageIndex: number;
  templateUsed: 'A' | 'B';
  data: Record<string, string>;
}

export interface ManualFormData {
  // 1. Identificación y Transporte
  nro: string;
  dua: string;
  tipoDeclaracion: string;
  manifiesto: string;
  docTransporte: string;
  aerolinea: string;
  fechaLlegada: string;
  fechaDeclaracion: string;
  
  // 2. Entidades
  numeroDeclarante: string;
  consignatario: string;
  rif: string;
  proveedor: string;
  sector: string;
  
  // 3. Mercancía
  item: string;
  posArancelaria: string;
  regimen: string;
  codRegimenExt: string;
  descRegimenExt: string;
  acuerdo: string;
  rubros: string;
  descMercancia: string;
  paisOrigen: string;

  // 4. Logística
  nomAlmacen: string;
  numAlmacen: string;
  bultos: string;
  cantidad: string;
  unidad: string;

  // 5. Valores y Control
  valorCifUsd: string;
  valorCifBs: string;
  tarifa: string;
  totalDeclaracion: string;
  multas: string;
  funcionario: string;
  fecha: string; // Nuevo campo genérico de control
  color: string;
  observacion: string;
}

export interface AppState {
  isProcessing: boolean;
  results: ExtractionResult[];
  fileName: string | null;
  pdfUrl: string | null;
  processingDuration: number | null;
  manualData: ManualFormData;
  searchTerm: string;
  setProcessing: (status: boolean) => void;
  setResults: (results: ExtractionResult[]) => void;
  setFileName: (name: string) => void;
  setPdfUrl: (url: string | null) => void;
  setProcessingDuration: (duration: number) => void;
  updateField: (pageIndex: number, key: string, value: string) => void;
  updateManualField: (key: keyof ManualFormData, value: string) => void;
  setManualData: (data: ManualFormData) => void;
  setSearchTerm: (term: string) => void;
}