import { expect, test } from "bun:test";
import { seasonalSuggestion } from "./seasonal";
import type { MonthlyVolume } from "./types";

const series = (vals: number[], startYM = "2025-01"): MonthlyVolume[] => {
  let [y, m] = startYM.split("-").map(Number);
  return vals.map((volume) => {
    const month = `${y}-${String(m).padStart(2, "0")}`;
    m++;
    if (m > 12) {
      m = 1;
      y++;
    }
    return { month, volume };
  });
};

test("null when fewer than 6 points", () => {
  expect(
    seasonalSuggestion(series([10, 20, 30]), new Date("2026-06-09")),
  ).toBeNull();
});

test("null when the series is flat (no clear peak)", () => {
  expect(
    seasonalSuggestion(
      series([100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100]),
      new Date("2026-06-09"),
    ),
  ).toBeNull();
});

test("suggests when a clear peak is 1..4 months ahead", () => {
  const vals = [10, 10, 10, 10, 10, 10, 10, 10, 200, 10, 10, 10]; // Jan..Dec, peak=Sep (month 9)
  const r = seasonalSuggestion(series(vals), new Date("2026-06-09")); // June(6) → Sep(9) = 3
  expect(r).toEqual({ peakMonth: 9, monthsUntil: 3 });
});

test("null when the peak is too far (>4 months)", () => {
  const vals = [10, 200, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10]; // peak=Feb(2)
  expect(seasonalSuggestion(series(vals), new Date("2026-06-09"))).toBeNull(); // June→next Feb = 8
});
