import { describe, it, expect } from "vitest";
import { deepMarriageCompat } from "./compat-deep";

describe("deepMarriageCompat", () => {
  it("aggregates without hour (3 methods)", () => {
    const r = deepMarriageCompat(
      { birthDate: "1990-08-15", gender: "Nam" },
      { birthDate: "1992-03-20", gender: "Nữ" }
    );
    expect(r.hasHour).toBe(false);
    expect(r.methods.length).toBe(3); // traditional + western + numerology
    expect(r.totalScore).toBeGreaterThanOrEqual(0);
    expect(r.totalScore).toBeLessThanOrEqual(100);
    expect(["rất hợp", "hợp", "bình hoà", "cần lưu ý", "khắc kỵ"]).toContain(r.rating);
  });

  it("aggregates with hour (4 methods)", () => {
    const r = deepMarriageCompat(
      { birthDate: "1990-08-15", gender: "Nam", hour: 10 },
      { birthDate: "1992-03-20", gender: "Nữ", hour: 14 }
    );
    expect(r.hasHour).toBe(true);
    expect(r.methods.length).toBe(4);
  });

  it("each method has details with at least 1 entry", () => {
    const r = deepMarriageCompat(
      { birthDate: "1990-08-15", gender: "Nam", hour: 10 },
      { birthDate: "1992-03-20", gender: "Nữ", hour: 14 }
    );
    for (const m of r.methods) {
      expect(m.details).toBeDefined();
      expect(m.details!.length).toBeGreaterThan(0);
    }
  });

  it("weights sum approximately 100", () => {
    const r = deepMarriageCompat(
      { birthDate: "1990-08-15", gender: "Nam", hour: 10 },
      { birthDate: "1992-03-20", gender: "Nữ", hour: 14 }
    );
    const sum = r.methods.reduce((s, m) => s + m.weight, 0);
    expect(sum).toBe(100);
  });

  it("throws on invalid date", () => {
    expect(() =>
      deepMarriageCompat(
        { birthDate: "not-a-date", gender: "Nam" },
        { birthDate: "1990-01-01", gender: "Nữ" }
      )
    ).toThrow();
  });

  it("hint reflects rating tier", () => {
    const r = deepMarriageCompat(
      { birthDate: "1990-08-15", gender: "Nam" },
      { birthDate: "1992-03-20", gender: "Nữ" }
    );
    expect(r.hint).toBeTruthy();
    expect(r.hint.length).toBeGreaterThan(20);
  });
});
