import { describe, it, expect } from "vitest";
import { monthGrid } from "./month_grid";

describe("monthGrid", () => {
  it("longitud siempre multiplo de 7", () => {
    for (let m = 1; m <= 12; m++) {
      expect(monthGrid(2026, m).length % 7).toBe(0);
    }
  });

  it("enero 2026 empieza en jueves (dow=3)", () => {
    // 1 enero 2026 es jueves. Mon-first => dow=3 (0=lun,1=mar,2=mie,3=jue)
    const cells = monthGrid(2026, 1);
    expect(cells[0].date).toBeNull();
    expect(cells[1].date).toBeNull();
    expect(cells[2].date).toBeNull();
    expect(cells[3].date).toBe("2026-01-01");
    expect(cells[3].inMonth).toBe(true);
  });

  it("febrero 2024 bisiesto tiene 29 dias", () => {
    const cells = monthGrid(2024, 2);
    const inMonth = cells.filter((c) => c.inMonth);
    expect(inMonth).toHaveLength(29);
    expect(inMonth[28].date).toBe("2024-02-29");
  });

  it("primer dia inMonth es el primero del mes", () => {
    const cells = monthGrid(2026, 5);
    const first = cells.find((c) => c.inMonth);
    expect(first?.date).toBe("2026-05-01");
  });

  it("ultimo dia inMonth es el ultimo del mes", () => {
    const cells = monthGrid(2026, 5); // mayo tiene 31 dias
    const last = [...cells].reverse().find((c) => c.inMonth);
    expect(last?.date).toBe("2026-05-31");
  });

  it("celdas de padding tienen date null", () => {
    const cells = monthGrid(2026, 1);
    const padding = cells.filter((c) => !c.inMonth);
    for (const p of padding) {
      expect(p.date).toBeNull();
    }
  });

  it("mes que empieza en lunes no tiene padding inicial", () => {
    // Buscamos un mes que empiece en lunes. Enero 2024: lunes.
    // 1 enero 2024 es lunes => firstDow=0 => no padding inicial
    const cells = monthGrid(2024, 1);
    expect(cells[0].date).toBe("2024-01-01");
    expect(cells[0].inMonth).toBe(true);
  });
});
