import test from "node:test";
import assert from "node:assert/strict";
import {
  isPassportReaderCandidateDocument,
  normalizePassportNumberCandidate,
  parsePassportNumberAgentResponse,
} from "./passport-reader-agent.js";

test("normalizes passport candidates from OCR and MRZ formatting", () => {
  assert.equal(normalizePassportNumberCandidate(" ab 123456<< "), "AB123456");
});

test("detects passport-like documents from metadata and text", () => {
  assert.equal(
    isPassportReaderCandidateDocument({
      documentTypeCode: "other_supporting",
      title: "Applicant bio page",
      originalFileName: "scan.pdf",
      textContent: "Passport No AB123456\nP<BRA",
    }),
    true,
  );
});

test("accepts high-confidence specialized passport extraction", () => {
  const parsed = parsePassportNumberAgentResponse({
    passport_number: "AB123456",
    confidence_score: 0.97,
    status: "confirmed",
    source: {
      label_detected: "Passport No",
      position_hint: "top right",
      extracted_from: "OCR",
    },
    alternative_candidates: [
      {
        value: "1234567890123",
        reason_rejected: "too long",
      },
    ],
    rationale: "Explicit Passport No label matched the biographic page value and the MRZ supported it.",
  });

  assert.equal(parsed.passportNumber, "AB123456");
  assert.equal(parsed.accepted, true);
  assert.equal(parsed.status, "confirmed");
  assert.equal(parsed.source.extractedFrom, "OCR");
  assert.equal(parsed.alternativeCandidates[0]?.value, "1234567890123");
});

test("rejects uncertain or invalid passport candidates", () => {
  const parsed = parsePassportNumberAgentResponse({
    passport_number: "2024-01-01",
    confidence_score: 0.42,
    status: "uncertain",
    rationale: "Could be a date, not a passport number.",
  });

  assert.equal(parsed.passportNumber, null);
  assert.equal(parsed.accepted, false);
  assert.equal(parsed.status, "uncertain");
});
