import { createHash } from "crypto";

type ExtractedData = Record<string, unknown>;

const field = (data: ExtractedData, aliases: string[]) => {
  const entry = Object.entries(data).find(([key]) => aliases.includes(key.trim().toLowerCase()));
  return entry?.[1];
};

const text = (value: unknown) => typeof value === "string" || typeof value === "number" ? String(value).trim() : "";
const alphanumeric = (value: unknown) => text(value).normalize("NFD").replace(/[\u0300-\u036f]/g, "").replace(/[^a-zA-Z0-9]/g, "").toUpperCase();

/**
 * Identifica una factura por emisor + comprobante. Se omite si OCR no logró
 * ambos datos: nunca se debe bloquear una factura basándose en un dato débil.
 */
export const invoiceFingerprint = (extractedData: ExtractedData): string | null => {
  const issuerRnc = alphanumeric(field(extractedData, ["rnc", "cedula_rnc", "rnc_emisor", "supplier_rnc", "vendor_rnc", "tax_id"]));
  const invoiceNumber = alphanumeric(field(extractedData, ["ncf", "nfc", "ncf_factura", "ncf_factura", "invoice_no", "invoice_number", "numero_factura", "factura_no", "codigo"]));
  return issuerRnc && invoiceNumber ? `${issuerRnc}:${invoiceNumber}` : null;
};

export const fileHash = (buffer: Buffer) => createHash("sha256").update(buffer).digest("hex");
