import { PDFParse } from 'pdf-parse';

export interface ParsedOpinion {
  rfc: string;
  razonSocial: string;
  estatus: string;
  folio: string;
  cadenaOriginal: string;
  fechaConsulta: string;
}

export async function parseOpinionPdf(pdfBuffer: Buffer): Promise<ParsedOpinion> {
  const pdfParse = new PDFParse({ data: new Uint8Array(pdfBuffer) });
  try {
    const textResult = await pdfParse.getText();
    const text = textResult.text;

    return {
      rfc: extractRfc(text),
      razonSocial: extractRazonSocial(text),
      estatus: extractEstatus(text),
      folio: extractFolio(text),
      cadenaOriginal: extractCadenaOriginal(text),
      fechaConsulta: extractFecha(text),
    };
  } finally {
    await pdfParse.destroy();
  }
}

function extractRfc(text: string): string {
  const match = text.match(/RFC\s+Folio\s*\n\s*([A-ZÑ&]{3,4}\d{6}[A-Z\d]{3})/i);
  if (match) return match[1].trim();
  const fallback = text.match(/\b([A-ZÑ&]{3,4}\d{6}[A-Z\d]{3})\b/);
  return fallback ? fallback[1] : 'NO_ENCONTRADO';
}

function extractRazonSocial(text: string): string {
  const match = text.match(/(?:Nombre|denominaci[oó]n|raz[oó]n social)\s+Sentido\s*\n\s*(.+)/i);
  if (match) {
    return match[1].trim().replace(/\s+(POSITIVO|NEGATIVO|EN SUSPENSI[OÓ]N|NO INSCRITO|INSCRITO SIN OBLIGACIONES)\s*$/i, '').trim();
  }
  return 'NO_ENCONTRADO';
}

function extractEstatus(text: string): string {
  const match = text.match(/Sentido\s*\n\s*.+\s+(POSITIVO|NEGATIVO|EN SUSPENSI[OÓ]N|NO INSCRITO|INSCRITO SIN OBLIGACIONES)\s*$/im);
  if (match) {
    const raw = match[1].trim().toUpperCase();
    if (raw === 'POSITIVO') return 'Positiva';
    if (raw === 'NEGATIVO') return 'Negativa';
    if (raw.includes('SUSPENSI')) return 'En suspensión';
    if (raw.includes('NO INSCRITO')) return 'No inscrito';
    if (raw.includes('SIN OBLIGACIONES')) return 'Inscrito sin obligaciones';
  }
  if (/POSITIVO/i.test(text)) return 'Positiva';
  if (/NEGATIVO/i.test(text)) return 'Negativa';
  return 'NO_DETERMINADO';
}

function extractFolio(text: string): string {
  const match = text.match(/RFC\s+Folio\s*\n\s*[A-ZÑ&]{3,4}\d{6}[A-Z\d]{3}\s+(\S+)/i);
  return match ? match[1].trim() : 'NO_ENCONTRADO';
}

function extractCadenaOriginal(text: string): string {
  const match = text.match(/Cadena Original\s*\n\s*(\|\|.+\|\|)/i);
  return match ? match[1].trim() : 'NO_ENCONTRADO';
}

function extractFecha(text: string): string {
  const match = text.match(/Fecha\s+y\s+hora\s+de\s+emisi[oó]n\s*\n\s*(.+)/i);
  if (match) return match[1].trim();
  const fallback = text.match(/(\d{1,2}\s+de\s+\w+\s+de\s+\d{4}\s+a\s+las\s+[\d:]+\s+horas)/i);
  return fallback ? fallback[1].trim() : 'NO_ENCONTRADO';
}
