import type { TipoDocumento } from '@prisma/client';

export type DocumentSequenceType =
  | 'BUDGET_FOLIO'
  | 'BOLETA'
  | 'FACTURA'
  | 'RECIBO'
  | 'RECETA'
  | 'COMPROBANTE_INGRESO'
  | 'COMPROBANTE_EGRESO'
  | 'RESUMEN_FINANCIERO'
  | 'INFORME_EJECUTIVO'
  | 'HISTORIA_CLINICA';

type SequenceDefinition = {
  keyBase: DocumentSequenceType;
  series: string;
};

const sequenceDefinitions: Record<DocumentSequenceType, SequenceDefinition> = {
  BUDGET_FOLIO: { keyBase: 'BUDGET_FOLIO', series: 'PRE001' },
  BOLETA: { keyBase: 'BOLETA', series: 'B001' },
  FACTURA: { keyBase: 'FACTURA', series: 'F001' },
  RECIBO: { keyBase: 'RECIBO', series: 'R001' },
  RECETA: { keyBase: 'RECETA', series: 'RX001' },
  COMPROBANTE_INGRESO: { keyBase: 'COMPROBANTE_INGRESO', series: 'CI001' },
  COMPROBANTE_EGRESO: { keyBase: 'COMPROBANTE_EGRESO', series: 'CE001' },
  RESUMEN_FINANCIERO: { keyBase: 'RESUMEN_FINANCIERO', series: 'RF001' },
  INFORME_EJECUTIVO: { keyBase: 'INFORME_EJECUTIVO', series: 'RP001' },
  HISTORIA_CLINICA: { keyBase: 'HISTORIA_CLINICA', series: 'HC001' },
};

export const getSequenceDefinition = (type: DocumentSequenceType) => sequenceDefinitions[type];

export const buildSequenceKey = (type: DocumentSequenceType, issuedAt = new Date()) =>
  `${sequenceDefinitions[type].keyBase}:${issuedAt.getFullYear()}`;

export const formatSequenceNumber = (series: string, currentNumber: number) =>
  `${series}-${String(currentNumber).padStart(6, '0')}`;

export const getBudgetDocumentSequenceType = (documentType: TipoDocumento | null | undefined): DocumentSequenceType => {
  if (documentType === 'FACTURA') {
    return 'FACTURA';
  }

  if (documentType === 'RECIBO') {
    return 'RECIBO';
  }

  return 'BOLETA';
};

export const getFinanceDocumentSequenceType = (movementType: string): DocumentSequenceType =>
  movementType === 'EGRESO' ? 'COMPROBANTE_EGRESO' : 'COMPROBANTE_INGRESO';

export const isDocumentSequenceType = (value: string): value is DocumentSequenceType =>
  value in sequenceDefinitions;
