import { describe, it, expect } from "vitest";
import { analyzePhoneNumber } from "./phone-luck";

describe("analyzePhoneNumber — base", () => {
  it("returns null for too-short input", () => {
    expect(analyzePhoneNumber("123")).toBeNull();
  });

  it("strips non-digits", () => {
    const r = analyzePhoneNumber("+84 (90) 123-4567");
    expect(r).not.toBeNull();
    expect(r!.digits).toBe("84901234567");
  });

  it("computes catScore from pairs", () => {
    // 1414 = all "14" Sinh Khí cát → 3 pairs (14,41,14) → 100%
    const r = analyzePhoneNumber("1414");
    expect(r!.catScore).toBe(100);
    expect(r!.pairs.every((p) => p.type === "Cát")).toBe(true);
  });

  it("identifies hung pairs", () => {
    // 1212 = all Tuyệt Mệnh
    const r = analyzePhoneNumber("1212");
    expect(r!.catScore).toBe(0);
    expect(r!.pairs.every((p) => p.type === "Hung")).toBe(true);
  });
});

describe("analyzePhoneNumber — personalized", () => {
  it("no personalization when birth info missing", () => {
    const r = analyzePhoneNumber("0901234567");
    expect(r!.personalized).toBeUndefined();
    expect(r!.pairs.every((p) => p.matchesMenh === undefined)).toBe(true);
  });

  it("personalizes for Tây tứ mệnh (Càn 1985 Nam)", () => {
    const r = analyzePhoneNumber("1414", { birthYear: 1985, gender: "Nam" });
    expect(r!.personalized).toBeDefined();
    expect(r!.personalized!.group).toBe("Tây Tứ Mệnh"); // 1985 Nam = Càn
    // Sinh Khí xếp hạng 3 cho Tây tứ mệnh, vẫn cát nhưng không phải tốt nhất
    expect(r!.personalized!.matchScore).toBeGreaterThan(0);
    expect(r!.personalized!.matchScore).toBeLessThan(100);
  });

  it("Đông tứ mệnh user gets high score on Sinh Khí pairs", () => {
    // 1990 Nam → cung Khảm (Đông tứ mệnh)
    const r = analyzePhoneNumber("14141414", { birthYear: 1990, gender: "Nam" });
    expect(r!.personalized!.cungMenh).toBe("Khảm");
    expect(r!.personalized!.group).toBe("Đông Tứ Mệnh");
    // Sinh Khí xếp hạng 0 (best) cho Đông tứ mệnh → score cao
    expect(r!.personalized!.matchScore).toBe(100);
  });

  it("flags matching pairs when fortune is in user's auspicious list", () => {
    const r = analyzePhoneNumber("1314", { birthYear: 1985, gender: "Nam" });
    expect(r!.personalized).toBeDefined();
    // 1985 Nam = Càn (Tây tứ mệnh) → bestFortunes = [Thiên Y, Phục Vị, Sinh Khí, Diên Niên]
    expect(r!.personalized!.group).toBe("Tây Tứ Mệnh");
    // 13 = Thiên Y (rank 0 cho Tây)
    expect(r!.pairs[0].fortune).toBe("Thiên Y");
    expect(r!.pairs[0].matchesMenh).toBe(true);
  });

  it("includes summary text and auspiciousFortunes list", () => {
    const r = analyzePhoneNumber("0901234567", { birthYear: 1985, gender: "Nam" });
    expect(r!.personalized).toBeDefined();
    expect(r!.personalized!.summary).toContain("cung");
    expect(r!.personalized!.auspiciousFortunes).toHaveLength(4);
    expect(r!.personalized!.summary).toMatch(/(rất hợp|khá hợp|tạm chấp nhận|không thực sự hợp)/);
  });
});
