import assert from "node:assert/strict";
import test from "node:test";
import {
  computeFormRunMetrics,
  deriveFormAgentCode,
  detectImmigrationCaseFromSignals,
  normalizeFormCode,
} from "./form-engine-heuristics.js";

test("deriveFormAgentCode normalizes USCIS forms", () => {
  assert.equal(deriveFormAgentCode("I-485"), "uscis_i_485");
  assert.equal(deriveFormAgentCode("G-28"), "uscis_g_28");
  assert.equal(deriveFormAgentCode("Form I-130"), "uscis_i_130");
});

test("normalizeFormCode extracts canonical code", () => {
  assert.equal(normalizeFormCode("Form I-140 Immigrant Petition"), "I-140");
  assert.equal(normalizeFormCode("g 28"), "G-28");
});

test("detectImmigrationCaseFromSignals classifies family package", () => {
  const analysis = detectImmigrationCaseFromSignals({
    forms: [{ code: "I-130" }, { code: "G-28" }],
    relationTypes: ["spouse", "petitioner"],
    factKeys: ["marriage_certificate", "beneficiary_address"],
    caseTexts: ["Family petition intake"],
  });

  assert.equal(analysis.caseType, "FAMILY");
  assert.equal(analysis.stageOfProcess, "petition_stage");
  assert.deepEqual(analysis.missingForms, []);
});

test("detectImmigrationCaseFromSignals classifies employment package", () => {
  const analysis = detectImmigrationCaseFromSignals({
    forms: [{ code: "I-140" }, { code: "I-485" }],
    relationTypes: ["employer", "sponsor"],
    factKeys: ["priority_date", "job_offer", "perm_case"],
    caseTexts: ["Employer sponsor and labor certification"],
  });

  assert.equal(analysis.caseType, "EB3");
  assert.equal(analysis.stageOfProcess, "adjustment_package");
  assert.deepEqual(analysis.missingForms, ["G-28"]);
});

test("computeFormRunMetrics returns normalized ratios", () => {
  const metrics = computeFormRunMetrics({
    totalFieldCount: 100,
    filledCount: 84,
    highConfidenceCount: 76,
    unresolvedCount: 16,
    reuseFromOtherForms: 12,
    previousCoverage: 0.7,
    conflictsCount: 4,
    coverageBySection: [
      {
        sectionName: "Identity",
        filled: 10,
        total: 12,
      },
    ],
  });

  assert.equal(metrics.percentFilled, 0.84);
  assert.equal(metrics.percentHighConfidence, 0.76);
  assert.equal(metrics.questionsNeeded, 16);
  assert.equal(metrics.reuseFromOtherForms, 12);
  assert.equal(metrics.learningGainFromMemory, 0.14);
  assert.equal(metrics.conflictRate, 0.04);
  assert.equal(metrics.coverageBySection[0]?.percentFilled, 10 / 12);
});
