import { describe, expect, it } from "vitest";
import { countMonthsInactive, quarterMonthsOf, revenueTier, skuTier } from "@/lib/classification";

describe("revenueTier / skuTier — ranh giới hạng đúng như bảng ngưỡng", () => {
  it.each([
    [50_000_000, "A"],
    [49_999_999, "B"],
    [20_000_000, "B"],
    [10_000_000, "C"],
    [5_000_000, "D"],
    [4_999_999, "E"],
    [0, "E"],
  ])("doanh thu %i → hạng %s", (revenue, expected) => {
    expect(revenueTier(revenue)).toBe(expected);
  });

  it.each([
    [31, "A"],
    [30, "B"],
    [21, "B"],
    [20, "C"],
    [11, "C"],
    [10, "D"],
    [6, "D"],
    [5, "E"],
    [0, "E"],
  ])("%i SKU → hạng %s", (sku, expected) => {
    expect(skuTier(sku)).toBe(expected);
  });
});

describe("countMonthsInactive — không đếm lùi quá ngày đại lý bắt đầu", () => {
  const months = new Map<string, { revenue: number }>();

  it("đại lý mới mở, chưa từng có đơn: KHÔNG bị tính 24 tháng", () => {
    // Trước đây thiếu chặn sinceMonth nên đại lý mới toanh bị báo "24 tháng không lấy hàng" ngay đêm đầu — bug thật đã sửa.
    expect(countMonthsInactive(months, "2026-08", "2026-08")).toBe(1);
    expect(countMonthsInactive(months, "2026-08", "2026-07")).toBe(2);
  });

  it("có doanh thu ở tháng quét thì 0 tháng không lấy hàng", () => {
    const m = new Map([["2026-08", { revenue: 5_000_000 }]]);
    expect(countMonthsInactive(m, "2026-08", "2026-01")).toBe(0);
  });

  it("có doanh thu 3 tháng trước, từ đó im lặng → đếm đúng 3", () => {
    const m = new Map([["2026-05", { revenue: 5_000_000 }]]);
    expect(countMonthsInactive(m, "2026-08", "2025-01")).toBe(3);
  });

  it("chặn ở 24 tháng dù đại lý đã mở lâu hơn nhiều", () => {
    expect(countMonthsInactive(months, "2026-08", "2020-01")).toBe(24);
  });
});

describe("quarterMonthsOf", () => {
  it("tháng 8 thuộc quý 3 → trả về tháng 7, 8, 9", () => {
    expect(quarterMonthsOf("2026-08")).toEqual(["2026-07", "2026-08", "2026-09"]);
  });
  it("tháng 1 thuộc quý 1 → trả về tháng 1, 2, 3", () => {
    expect(quarterMonthsOf("2026-01")).toEqual(["2026-01", "2026-02", "2026-03"]);
  });
});
