import assert from "node:assert/strict";
import test from "node:test";
import {
  buildLegacyEmploymentAdjustmentFactCandidates,
  buildLegacyEmploymentAdjustmentKnowledge,
  extractLegacyEmploymentAdjustmentArtifactsFromDocuments,
  parseLegacyEmploymentAdjustmentCaseData,
} from "./legacy-employment-adjustment.js";

const sampleCaseDataJson = JSON.stringify({
  case_id: "EMP-AOS-001",
  project_type: "employment_aos",
  applicant: {
    a_number: "A123456789",
    name: {
      family: "Sheikh",
      given: "Md Lovlu",
      middle: "",
    },
    dob: "1990-01-02",
    city_of_birth: "Dhaka",
    country_of_birth: "Bangladesh",
    country_of_citizenship: "Bangladesh",
    ssn: "123-45-6789",
    sex: "Male",
    marital_status: "Married",
    mailing_address: {
      street: "123 Main St",
      city: "New York",
      state: "NY",
      zip: "10001",
      country: "United States",
    },
    phone: "+1 555 111 2222",
    email: "md@example.com",
    passport: {
      number: "P1234567",
      country_of_issuance: "Bangladesh",
      expiration: "2030-05-01",
    },
    visa_at_last_entry: {
      number: "VISA1234",
    },
    height_ft: "5",
    height_in: "10",
    weight_lb: "170",
    eye_color: "Brown",
    hair_color: "Black",
  },
  petitioner: {
    legal_name: "Acme Corp",
    fein: "11-1111111",
    phone: "+1 555 333 4444",
    email: "hr@acme.test",
  },
  i140: {
    receipt_number: "IOE1234567890",
    priority_date: "2024-06-15",
    category: "EB3 Skilled Worker",
    perm_case_number: "A-12345-67890",
    job_title: "Software Engineer",
    offered_wage: "$120000",
  },
  travel_history: [
    {
      date_of_entry: "2024-08-01",
      class_of_admission: "H1B",
      admit_until: "2027-08-01",
      i94_number: "I940001",
      inspected: true,
    },
  ],
  current_status: {
    class: "H1B",
    expires: "2027-08-01",
  },
  parents: [
    {
      role: "father",
      family: "Sheikh",
      given: "Abdul",
      dob: "1960-01-01",
      country_of_birth: "Bangladesh",
    },
    {
      role: "mother",
      family: "Begum",
      given: "Amina",
      dob: "1965-02-02",
      country_of_birth: "Bangladesh",
    },
  ],
  marriages: [
    {
      status: "current",
      spouse: {
        family: "Sheikh",
        given: "Sara",
        dob: "1992-03-03",
        country_of_birth: "Bangladesh",
      },
      date_of_marriage: "2020-04-04",
      place_of_marriage: {
        country: "Bangladesh",
      },
    },
  ],
  dependents: [
    {
      relationship: "child",
      filing_with_principal: true,
      name: {
        family: "Sheikh",
        given: "Adam",
      },
      dob: "2021-05-05",
      country_of_birth: "United States",
    },
  ],
  eligibility_answers: {
    ever_arrested: false,
    ever_public_cash_assistance: false,
    household_size: 3,
    household_assets_value: "25000",
  },
  meta: {
    missing_fields: ["parents[0].city_of_residence"],
  },
});

test("parse and project legacy employment adjustment case data into knowledge", () => {
  const artifacts = extractLegacyEmploymentAdjustmentArtifactsFromDocuments([
    {
      title: "case_data.json",
      extracted_text: sampleCaseDataJson,
    },
    {
      title: "BUILD_REPORT.json",
      extracted_text: JSON.stringify({
        forms: { i485: { wrote: 100, skipped: 10 } },
        missing: ["travel_history[0].port_of_entry"],
      }),
    },
  ]);

  const parsed = parseLegacyEmploymentAdjustmentCaseData(sampleCaseDataJson);
  const knowledge = buildLegacyEmploymentAdjustmentKnowledge(artifacts);

  assert.ok(parsed);
  assert.ok(knowledge);
  assert.match(knowledge.summaryText, /Legacy employment-based adjustment export available/i);
  assert.ok(
    knowledge.profileFacts.some(
      (fact) => fact.factKey === "client_birth_city" && fact.value === "Dhaka",
    ),
  );
  assert.ok(
    knowledge.knowledgeFacts.some(
      (fact) => fact.factKey === "i140_receipt_number" && fact.value === "IOE1234567890",
    ),
  );
  assert.ok(
    knowledge.unresolvedTopics.some((topic) => /travel history 0 port of entry/i.test(topic)),
  );
});

test("build legacy fact candidates for high-value I-485 structured fields", () => {
  const parsed = parseLegacyEmploymentAdjustmentCaseData(sampleCaseDataJson);
  assert.ok(parsed);

  const candidates = buildLegacyEmploymentAdjustmentFactCandidates(parsed);
  const candidateByKey = new Map(candidates.map((candidate) => [candidate.fieldKey, candidate]));

  assert.equal(candidateByKey.get("client_alien_number")?.rawValue, "A123456789");
  assert.equal(candidateByKey.get("client_i94_number")?.rawValue, "I940001");
  assert.equal(candidateByKey.get("i140_category")?.rawValue, "skilled_worker");
  assert.equal(candidateByKey.get("parent_1_full_name")?.rawValue, "Abdul Sheikh");
  assert.equal(candidateByKey.get("number_of_children")?.rawValue, "1");
});
