import { calcularDv } from 'src/crm/cierre/ruc.util';

/**
 * CDC (Código de Control) de un documento electrónico de SIFEN: 44 dígitos.
 * iTiDE(2) + RUC emisor(8) + DV(1) + establecimiento(3) + punto(3) + número(7) +
 * tipo de contribuyente(1) + fecha AAAAMMDD(8) + tipo de emisión(1) + código de
 * seguridad(9) + dígito verificador(1). El último dígito es el módulo 11 de los 43
 * anteriores, el mismo cálculo que el DV del RUC.
 */
export interface DatosCdc {
  cdc: string;
  tipoDocumento: number;
  ruc: string;
  dv: string;
  establecimiento: string;
  punto: string;
  numero: string;
  /** AAAA-MM-DD */
  fecha: string;
}

export function parsearCdc(valor: string | null | undefined): DatosCdc | null {
  const cdc = String(valor ?? '').replace(/\D/g, '');
  if (cdc.length !== 44) return null;
  if (calcularDv(cdc.slice(0, 43)) !== Number(cdc[43])) return null;
  const f = cdc.slice(25, 33);
  return {
    cdc,
    tipoDocumento: Number(cdc.slice(0, 2)),
    ruc: cdc.slice(2, 10).replace(/^0+/, ''),
    dv: cdc[10],
    establecimiento: cdc.slice(11, 14),
    punto: cdc.slice(14, 17),
    numero: cdc.slice(17, 24),
    fecha: `${f.slice(0, 4)}-${f.slice(4, 6)}-${f.slice(6, 8)}`,
  };
}

/** El CDC que trae el QR de un KuDE (URL de consulta con `Id=`) o el CDC pegado tal cual. */
export function cdcDesdeTexto(texto: string | null | undefined): string | null {
  const t = String(texto ?? '').trim();
  const id = t.match(/[?&]Id=(\d{44})/i)?.[1];
  const candidato = id ?? t.replace(/\D/g, '');
  return parsearCdc(candidato)?.cdc ?? null;
}
