import { describe, it, expect } from "vitest";
import { westernCompat, westernMatches, westernDomainHint } from "./western-zodiac";

describe("westernCompat", () => {
  it("returns null for invalid slug", () => {
    // @ts-expect-error invalid slug literal
    expect(westernCompat("foo", "bach-duong")).toBeNull();
  });

  it("same element scores high", () => {
    // bach-duong and su-tu are both Lửa
    const r = westernCompat("bach-duong", "su-tu");
    expect(r).not.toBeNull();
    expect(r!.elementScore).toBe(80);
    expect(r!.totalScore).toBeGreaterThan(60);
  });

  it("opposite elements score low", () => {
    // bach-duong (Lửa) and cu-giai (Nước) — Lửa-Nước
    const r = westernCompat("bach-duong", "cu-giai");
    expect(r!.elementScore).toBe(35);
    expect(r!.totalScore).toBeLessThan(55);
  });

  it("complementary elements (Lửa-Khí) score high", () => {
    // bach-duong (Lửa) and song-tu (Khí)
    const r = westernCompat("bach-duong", "song-tu");
    expect(r!.elementScore).toBe(75);
  });

  it("returns rating string", () => {
    const r = westernCompat("bach-duong", "su-tu");
    expect(["rất hợp", "hợp", "trung tính", "thử thách"]).toContain(r!.rating);
  });

  it("returns notes explaining the relationship", () => {
    const r = westernCompat("bach-duong", "su-tu");
    expect(r!.notes.length).toBeGreaterThan(0);
  });
});

describe("westernMatches", () => {
  it("returns 4 best and 4 worst", () => {
    const r = westernMatches("bach-duong");
    expect(r.best.length).toBe(4);
    expect(r.worst.length).toBe(4);
  });

  it("best scores >= worst scores", () => {
    const r = westernMatches("bach-duong");
    const minBest = Math.min(...r.best.map((m) => m.score));
    const maxWorst = Math.max(...r.worst.map((m) => m.score));
    expect(minBest).toBeGreaterThanOrEqual(maxWorst);
  });

  it("does not include self in matches", () => {
    const r = westernMatches("bach-duong");
    expect(r.best.find((m) => m.slug === "bach-duong")).toBeUndefined();
    expect(r.worst.find((m) => m.slug === "bach-duong")).toBeUndefined();
  });
});

describe("westernDomainHint", () => {
  it("returns 3 fields for valid sign", () => {
    const h = westernDomainHint("bach-duong");
    expect(h.career.length).toBeGreaterThan(20);
    expect(h.finance.length).toBeGreaterThan(20);
    expect(h.health.length).toBeGreaterThan(20);
  });

  it("differs by element", () => {
    const fire = westernDomainHint("bach-duong"); // Lửa
    const earth = westernDomainHint("kim-nguu"); // Đất
    expect(fire.career).not.toBe(earth.career);
  });
});
