import { describe, expect, it } from "vitest";
import {
  expandDirectionalStreet,
  parseStreetDirection,
  scoreMothershipCandidateForDraft,
  sortMothershipCandidatesForDraft,
} from "@/lib/address/street-normalize";
import type { MothershipAddressCandidate } from "@/modules/address/types";

function cand(
  street: string,
  display: string,
): MothershipAddressCandidate {
  return {
    option_id: `id-${street.replace(/\s+/g, "-")}`,
    display_label: display,
    formatted_address: display,
    street,
    city: "Pomona",
    state: "CA",
    zip: "",
  };
}

describe("street-normalize", () => {
  it("expandDirectionalStreet 展开 W 7th St", () => {
    expect(expandDirectionalStreet("600 W 7th St")).toBe(
      "600 West 7th Street",
    );
    expect(parseStreetDirection("600 W 7th St")).toBe("W");
    expect(parseStreetDirection("600 East 7th Street")).toBe("E");
  });

  it("600 W 7th St 草稿优先 West 7th，惩罚 East", () => {
    const draft = { street: "600 W 7th St", city: "Pomona", state: "CA" };
    const west = cand(
      "600 West 7th Street",
      "600 West 7th Street, Pomona, California, USA",
    );
    const abbrev = cand(
      "600 W 7th St",
      "600 W 7th St, Pomona, California, USA",
    );
    const east = cand(
      "600 East 7th Street",
      "600 East 7th Street, Pomona, California, USA",
    );

    const sorted = sortMothershipCandidatesForDraft(
      [abbrev, east, west],
      draft,
    );
    expect(sorted[0]?.street).toBe("600 West 7th Street");
    expect(scoreMothershipCandidateForDraft(east, draft)).toBeLessThan(
      scoreMothershipCandidateForDraft(west, draft),
    );
  });
});
