import { describe, expect, it } from "vitest";
import { extractActaLookupDictionary, extractFields } from "@/lib/extraction/extractFields";

describe("extractFields", () => {
  it("extracts legal fields from mixed capitalization and punctuation", () => {
    const text = `
      Razon social: Treisole S.A. de C.V.
      R.F.C.: TRE-240101-AB1
      Fecha de constitucion: 15 de Marzo de 2019
      Escritura publica No. 12345
      Representante legal: Ana Torres Ramirez
      Notario Publico: Lic. Carlos Mendoza
      Domicilio fiscal:
      Av. Juarez 123, Centro, Monterrey, Nuevo Leon
      Objeto social:
      Comercializacion de alimentos y bebidas, importacion y distribucion.
      Entidad federativa: Nuevo Leon
    `;

    const result = extractFields(text);

    expect(result.name).toBe("Treisole S.A. de C.V");
    expect(result.rfc).toBeNull();
    expect(result.legalRepresentative).toContain("Ana Torres");
    expect(result.incorporationDate).toContain("15 de Marzo de 2019");
    expect(result.deedNumber).toBe("12345");
    expect(result.notaryName).toContain("Carlos Mendoza");
    expect(result.fiscalAddress).toContain("Monterrey");
    expect(result.businessPurpose).toContain("Comercializacion");
    expect(result.stateOfIncorporation).toContain("Nuevo Leon");
  });

  it("avoids overcapturing legal name on sas contract headers and keeps RFC empty", () => {
    const text = `
      SAS2025858008 Denominación- TREISOLE Contrato Social de Sociedad por Acciones Simplificada
      Contrato Social de Sociedad por Acciones Simplificada que celebran MARCELO DARES BALLI.
      Primera. Denominación. La sociedad se denominará TREISOLE.
      Tercera. Domicilio. El domicilio de la sociedad será el ubicado en CALLE LAZARO GARZA AYALA NÚMERO EXTERIOR 205
      COLONIA TAMPIQUITO LOCALIDAD SAN PEDRO GARZA GARCIA MUNICIPIO SAN PEDRO GARZA GARCIA ENTIDAD FEDERATIVA NUEVO LEÓN.
      Cuarta. Duración. La duración de la sociedad será Indefinida.
      Quinta. Capital social El capital social fijo es la cantidad de 960 pesos.
      La porción variable del capital social es la cantidad de 40 pesos.
      Fecha de constitución: 25-04-04
      RFC del socio: DABM030731AU7
    `;

    const result = extractFields(text);
    const dictionary = extractActaLookupDictionary(text);

    expect(result.name).toBe("TREISOLE");
    expect(result.rfc).toBeNull();
    expect(result.incorporationDate).toContain("25-04-04");
    expect(result.deedNumber).toBe("SAS2025858008");
    expect(result.fiscalAddress).toContain("SAN PEDRO GARZA GARCIA");
    expect(result.stateOfIncorporation).toContain("NUEVO LEÓN");
    expect(dictionary.capitalFixed).toContain("960");
    expect(dictionary.capitalVariable).toContain("40");
  });

  it("builds an extended lookup dictionary for company profile storage", () => {
    const text = `
      Escritura publica numero 7789.
      Tomo: 44.
      En la ciudad de Monterrey, Nuevo Leon, a los 12 de abril de 2022.
      La denominacion social sera: Comercializadora Delta S.A. de C.V.
      Duracion: indefinida.
      Capital social asciende a $100,000.00 M.N.
      Capital fijo: $50,000.00
      Capital variable: $50,000.00
      Valor nominal: $1,000.00
      Objeto social:
      Comercializacion e importacion de equipo industrial.
      Notario Publico numero 10 del estado de Nuevo Leon, Lic. Carlos Mendoza.
      Clausula de extranjeros: se consideraran como nacionales y no invocar la proteccion de su gobierno.
    `;

    const result = extractActaLookupDictionary(text);

    expect(result.instrumentNumber).toBe("7789");
    expect(result.protocolVolumeBook).toBe("44");
    expect(result.placeOfGranting).toContain("Monterrey");
    expect(result.companyType).toBe("SA_DE_CV");
    expect(result.capitalTotal).toContain("100,000.00");
    expect(result.notaryNumber).toBe("10");
    expect(result.foreignersClause).toBe("CLAUSULA_CALVO");
    expect(result.derivedFields.isCompanyValidlyConstituted).toBe(true);
  });

  it("leaves missing fields as null", () => {
    const result = extractFields("Acta sin datos suficientes");

    expect(result.rfc).toBeNull();
    expect(result.notaryName).toBeNull();
  });
});
