import { describe, expect, it } from "vitest";

import { formatTeamMessages, makeTeams, parseTeamSize } from "./team.js";

describe("makeTeams", () => {
  it("8명을 4명씩 두 팀으로 나눈다", () => {
    const members = Array.from({ length: 8 }, (_, index) => index + 1);
    const teams = makeTeams(members, 4, () => 0.5);

    expect(teams).toHaveLength(2);
    expect(teams.map((team) => team.length)).toEqual([4, 4]);
    expect(teams.flat().sort((a, b) => a - b)).toEqual(members);
  });

  it("남는 인원은 마지막 팀에 둔다", () => {
    const teams = makeTeams([1, 2, 3, 4, 5], 4, () => 0.5);

    expect(teams.map((team) => team.length)).toEqual([4, 1]);
  });

  it("원본 배열을 변경하지 않는다", () => {
    const members = [1, 2, 3];

    makeTeams(members, 2, () => 0);

    expect(members).toEqual([1, 2, 3]);
  });
});

describe("parseTeamSize", () => {
  it.each(["1", "4", "99"])("유효한 입력 %s를 허용한다", (value) => {
    expect(parseTeamSize(value)).toBe(Number(value));
  });

  it.each([undefined, "", "0", "100", "4.5", "네명", "4 5"])(
    "잘못된 입력 %s를 거부한다",
    (value) => {
      expect(parseTeamSize(value)).toBeNull();
    },
  );
});

describe("formatTeamMessages", () => {
  it("Discord 멘션을 굵게 표시한다", () => {
    expect(formatTeamMessages([[{ id: "1" }, { id: "2" }]])).toEqual([
      "1팀: **<@1>**, **<@2>**",
    ]);
  });

  it("제한 길이에 맞춰 여러 메시지로 나눈다", () => {
    const messages = formatTeamMessages(
      [[{ id: "123456789012345678" }, { id: "223456789012345678" }, { id: "323456789012345678" }]],
      60,
    );

    expect(messages.length).toBeGreaterThan(1);
    expect(messages.every((message) => message.length <= 60)).toBe(true);
  });
});
