import { describe, it, expect } from "vitest";
import { CFP_12, BRACKET_TEMPLATES, getScoringRoundType } from "~/lib/bracket-templates";

describe("CFP_12 Bracket Template", () => {
  describe("Template structure", () => {
    it("has correct total teams", () => {
      expect(CFP_12.totalTeams).toBe(12);
    });

    it("has 4 rounds", () => {
      expect(CFP_12.rounds).toHaveLength(4);
    });

    it("has correct round names", () => {
      expect(CFP_12.rounds[0].name).toBe("First Round");
      expect(CFP_12.rounds[1].name).toBe("Quarterfinals");
      expect(CFP_12.rounds[2].name).toBe("Semifinals");
      expect(CFP_12.rounds[3].name).toBe("National Championship");
    });

    it("has correct match counts per round", () => {
      expect(CFP_12.rounds[0].matchCount).toBe(4); // 8 seeds play, 4 byes
      expect(CFP_12.rounds[1].matchCount).toBe(4); // 8 → 4
      expect(CFP_12.rounds[2].matchCount).toBe(2); // 4 → 2
      expect(CFP_12.rounds[3].matchCount).toBe(1); // 2 → 1
    });

    it("has correct round advancement chain", () => {
      expect(CFP_12.rounds[0].feedsInto).toBe("Quarterfinals");
      expect(CFP_12.rounds[1].feedsInto).toBe("Semifinals");
      expect(CFP_12.rounds[2].feedsInto).toBe("National Championship");
      expect(CFP_12.rounds[3].feedsInto).toBeNull();
    });
  });

  describe("Scoring configuration", () => {
    it("scoring starts at Quarterfinals", () => {
      expect(CFP_12.scoringStartsAtRound).toBe("Quarterfinals");
    });

    it("First Round is not scoring", () => {
      expect(CFP_12.rounds[0].isScoring).toBe(false);
    });

    it("Quarterfinals is scoring", () => {
      expect(CFP_12.rounds[1].isScoring).toBe(true);
    });

    it("Semifinals is scoring", () => {
      expect(CFP_12.rounds[2].isScoring).toBe(true);
    });

    it("National Championship is scoring", () => {
      expect(CFP_12.rounds[3].isScoring).toBe(true);
    });
  });

  describe("Template ID and registry", () => {
    it("has id cfp_12", () => {
      expect(CFP_12.id).toBe("cfp_12");
    });

    it("is registered in BRACKET_TEMPLATES", () => {
      expect(BRACKET_TEMPLATES["cfp_12"]).toBeDefined();
      expect(BRACKET_TEMPLATES["cfp_12"]).toBe(CFP_12);
    });
  });

  describe("getScoringRoundType", () => {
    it("classifies Quarterfinals as quarterfinals (losers share 5th–8th)", () => {
      expect(getScoringRoundType("Quarterfinals", CFP_12)).toBe("quarterfinals");
    });

    it("classifies Semifinals as semifinals (losers share 3rd–4th)", () => {
      expect(getScoringRoundType("Semifinals", CFP_12)).toBe("semifinals");
    });

    it("classifies National Championship as finals", () => {
      expect(getScoringRoundType("National Championship", CFP_12)).toBe("finals");
    });

    it("returns null for First Round (non-scoring)", () => {
      expect(getScoringRoundType("First Round", CFP_12)).toBeNull();
    });
  });

  describe("Total matches", () => {
    it("has 11 total matches across all rounds", () => {
      const total = CFP_12.rounds.reduce((sum, r) => sum + r.matchCount, 0);
      expect(total).toBe(11); // 4 + 4 + 2 + 1
    });
  });
});
