export type TipoCfdi = 'EMITIDO' | 'RECIBIDO';
export type TipoComprobante = 'I' | 'E' | 'T' | 'P' | 'N';
export type EstadoCfdi = 'Vigente' | 'Cancelado' | '0' | '1';

export interface Cfdi {
  id: number;
  year: string | null;
  month: string | null;
  type: TipoCfdi;
  uuid: string;
  serie: string | null;
  folio: string | null;
  status: EstadoCfdi;
  fechaEmision: string;
  rfcEmisor: string;
  nombreEmisor: string;
  rfcReceptor: string;
  nombreReceptor: string;
  subtotal: number;
  subtotalMxn: number;
  descuento: number;
  descuentoMxn: number;
  total: number;
  totalMxn: number;
  saldoInsoluto: string | null;
  moneda: string;
  tipoCambio: number;
  tipoComprobante: string | null;
  metodoPago: string | null;
  formaPago: string | null;
  usoCfdi: string | null;
  pac: string | null;
  fechaCertSat: string | null;
  fechaCancelacion: string | null;
  uuidRelacionado: string | null;
  // Impuestos del comprobante
  isrRetencion: number;
  isrRetencionMxn: number;
  ivaTraslado: number;
  ivaTrasladoMxn: number;
  ivaRetencion: number;
  ivaRetencionMxn: number;
  iepsTraslado: number;
  iepsTrasladoMxn: number;
  iepsRetencion: number;
  iepsRetencionMxn: number;
  impuestosLocalesTrasladado: number;
  impuestosLocalesTrasladoMxn: number;
  impuestosLocalesRetenidos: number;
  impuestosLocalesRetenidosMxn: number;
  // Complemento de pagos
  montoPago: number;
  montoPagoMxn: number;
  fechaPagoP: string | null;
  numParcialidad: string | null;
  isrRetencionPago: number;
  isrRetencionPagoMxn: number;
  ivaTrasladoPago: number;
  ivaTrasladoPagoMxn: number;
  ivaRetencionPago: number;
  ivaRetencionPagoMxn: number;
  iepsTrasladoPago: number;
  iepsTrasladoPagoMxn: number;
  iepsRetencionPago: number;
  iepsRetencionPagoMxn: number;
  saldoPendiente: number;
  saldoPendienteMxn: number;
  fechaLiquidacion: string | null;
  fechaPago: string | null;
  fechaInicialPago: string | null;
  fechaFinalPago: string | null;
  numDiasPagados: number;
  // Nómina
  numSeguroSocial: string | null;
  puesto: string | null;
  salarioBaseCotApor: number;
  salarioBaseCotAporMxn: number;
  salarioDiarioIntegrado: number;
  salarioDiarioIntegradoMxn: number;
  totalPercepciones: number;
  totalPercepcionesMxn: number;
  totalDeducciones: number;
  totalDeduccionesMxn: number;
  impRetenidosNomina: number;
  impRetenidosNominaMxn: number;
  otrasDeduccionesNomina: number;
  otrasDeduccionesNominaMxn: number;
  subsidioCausado: number;
  subsidioCausadoMxn: number;
  // Conciliación
  conciliado: string | null;
  // Régimen fiscal
  regimenFiscalEmisor: string | null;
  regimenFiscalReceptor: string | null;
  // FK a tabla rfcs
  rfcEmisorId: number | null;
  rfcReceptorId: number | null;
  // Archivos y sync
  xmlUrl: string | null;
  pdfUrl: string | null;
  xmlOriginal: string | null;
  cfdiTipoRelacion: string | null;
  cfdisRelacionados: string | null;
  lastSatSync: string | null;
  satSyncJobId: string | null;
  source: string | null;
  facturapiId: string | null;
  contribuyenteId: string | null;
  creadoEn: string;
  actualizadoEn: string;
}

export interface CfdiFilters {
  tipo?: TipoCfdi;
  tipoComprobante?: TipoComprobante;
  estado?: EstadoCfdi;
  fechaInicio?: string;
  fechaFin?: string;
  rfc?: string;
  emisor?: string;
  receptor?: string;
  search?: string;
  contribuyenteId?: string;
  page?: number;
  limit?: number;
}

export interface CfdiConcepto {
  id: number;
  cfdiId: number;
  claveProdServ: string | null;
  noIdentificacion: string | null;
  descripcion: string;
  cantidad: number;
  claveUnidad: string | null;
  unidad: string | null;
  valorUnitario: number;
  valorUnitarioMxn: number;
  importe: number;
  importeMxn: number;
  descuento: number;
  descuentoMxn: number;
  isrRetencion: number;
  isrRetencionMxn: number;
  ivaTraslado: number;
  ivaTrasladoMxn: number;
  ivaRetencion: number;
  ivaRetencionMxn: number;
  iepsTraslado: number;
  iepsTrasladoMxn: number;
  iepsRetencion: number;
  iepsRetencionMxn: number;
  impuestosLocalesTrasladado: number;
  impuestosLocalesTrasladoMxn: number;
  impuestosLocalesRetenidos: number;
  impuestosLocalesRetenidosMxn: number;
  totalPercepciones: number;
  totalPercepcionesMxn: number;
  totalDeducciones: number;
  totalDeduccionesMxn: number;
  impRetenidosNomina: number;
  impRetenidosNominaMxn: number;
  otrasDeduccionesNomina: number;
  otrasDeduccionesNominaMxn: number;
  subsidioCausado: number;
  subsidioCausadoMxn: number;
  creadoEn: string;
}

export interface CfdiListResponse {
  data: Cfdi[];
  total: number;
  page: number;
  limit: number;
  totalPages: number;
}
