// @vitest-environment jsdom

import { cleanup, render, screen } from "@testing-library/react";
import type { ComponentProps } from "react";
import { afterEach, describe, expect, it, vi } from "vitest";
import { PlayersAdminPlayerList } from "@/components/players-admin-player-list";
import type { BallboxStoreAdminPlayer, BallboxStoreClubListItem } from "@/lib/ballbox-store";

const playerCardSpy = vi.fn();

vi.mock("@/components/players-admin-player-card", () => ({
  PlayersAdminPlayerCard: (props: unknown) => {
    playerCardSpy(props);
    return <div data-testid="player-card" />;
  },
}));

const players: BallboxStoreAdminPlayer[] = [
  { id: "player_1", name: "Player One", whatsappPhone: null, telegramHandle: null, gender: null, birthYear: null, coachCategory: null, memberships: [] },
  { id: "player_2", name: "Player Two", whatsappPhone: null, telegramHandle: null, gender: null, birthYear: null, coachCategory: null, memberships: [] },
];

const clubs: BallboxStoreClubListItem[] = [
  { id: "club_1", atcSportclubId: "106", name: "Club One", locationName: null, venues: 1, machines: 1, screens: 1 },
];

function renderPlayerList(overrides?: Partial<ComponentProps<typeof PlayersAdminPlayerList>>) {
  return render(
    <PlayersAdminPlayerList
      players={players}
      setPlayers={vi.fn()}
      busy={false}
      clubs={clubs}
      membershipClubIds={{ player_2: "club_1" }}
      setMembershipClubIds={vi.fn()}
      articleCardClassName="article"
      insetPanelClassName="inset"
      wellClassName="well"
      selectClassName="select"
      runMutation={vi.fn()}
      {...overrides}
    />,
  );
}

describe("PlayersAdminPlayerList", () => {
  afterEach(() => {
    cleanup();
    playerCardSpy.mockReset();
  });

  it("renders the empty state when there are no players", () => {
    renderPlayerList({ players: [] });

    expect(screen.getByText("No players yet.")).toBeTruthy();
  });

  it("forwards each player into the extracted player card seam", () => {
    const setPlayers = vi.fn();
    renderPlayerList({ setPlayers });

    expect(screen.getAllByTestId("player-card")).toHaveLength(2);
    expect(playerCardSpy).toHaveBeenNthCalledWith(
      1,
      expect.objectContaining({
        player: players[0],
        setPlayers,
        clubs,
        membershipClubIds: { player_2: "club_1" },
        articleCardClassName: "article",
        insetPanelClassName: "inset",
        wellClassName: "well",
        selectClassName: "select",
      }),
    );
  });
});
