import assert from "node:assert/strict";
import test from "node:test";
import {
  extractPersonName,
  isGreetingOnly,
  isNonUsLocation,
  isPlausibleName,
  parseUsState,
  US_STATES,
} from "@/lib/mortgage/usGeo";

test("parseUsState full names and codes", () => {
  assert.equal(parseUsState("Texas"), "TX");
  assert.equal(parseUsState("new york"), "NY");
  assert.equal(parseUsState("CA"), "CA");
  assert.equal(parseUsState("I live in Florida"), "FL");
  assert.equal(parseUsState("district of columbia"), "DC");
  assert.equal(parseUsState("oklahoma"), "OK");
  assert.equal(parseUsState("indiana"), "IN");
});

test("parseUsState rejects greetings and non-US", () => {
  assert.equal(parseUsState("Hi"), null);
  assert.equal(parseUsState("hello"), null);
  assert.equal(parseUsState(""), null);
  assert.equal(parseUsState("Rajsthan"), null);
});

test("ambiguous HI only with hawaii cue", () => {
  assert.equal(parseUsState("HI"), null);
  assert.equal(parseUsState("Hawaii"), "HI");
});

test("isGreetingOnly", () => {
  assert.equal(isGreetingOnly("Hi"), true);
  assert.equal(isGreetingOnly("Good morning!"), true);
  assert.equal(isGreetingOnly("ok"), false);
  assert.equal(isGreetingOnly("My name is Pat"), false);
});

test("isNonUsLocation", () => {
  assert.equal(isNonUsLocation("I live in India"), true);
  assert.equal(isNonUsLocation("Dallas Texas"), false);
});

test("extractPersonName", () => {
  assert.equal(extractPersonName("My name is John Michael Smith"), "John Michael Smith");
  assert.equal(extractPersonName("I am not using any tobacco"), null);
  assert.equal(extractPersonName("I am only a cigar smoker"), null);
  assert.ok(extractPersonName("My Self John Smith"));
  assert.ok(extractPersonName("this is Jane Doe from Dallas"));
  assert.ok(extractPersonName("Hi I am Jane Doe"));
});

test("isPlausibleName", () => {
  assert.equal(isPlausibleName("Ann Lee"), true);
  assert.equal(isPlausibleName("only cigar smoker"), false);
  assert.equal(isPlausibleName(""), false);
});

test("US_STATES has fifty plus DC", () => {
  assert.ok(Object.values(US_STATES).includes("TX"));
  assert.ok(new Set(Object.values(US_STATES)).size >= 51);
});
