// @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 { NetworkAdminCreateClubSection } from "@/components/network-admin-create-club-section";

const sectionHeaderSpy = vi.fn();
const createClubFormSpy = vi.fn();

vi.mock("@/components/network-admin-section-header", () => ({
  NetworkAdminSectionHeader: (props: unknown) => {
    sectionHeaderSpy(props);
    return <div data-testid="section-header" />;
  },
}));

vi.mock("@/components/network-admin-create-club-form", () => ({
  NetworkAdminCreateClubForm: (props: unknown) => {
    createClubFormSpy(props);
    return <div data-testid="create-club-form" />;
  },
}));

function renderSection(overrides?: Partial<ComponentProps<typeof NetworkAdminCreateClubSection>>) {
  return render(
    <NetworkAdminCreateClubSection
      busy={false}
      message="Club created"
      messageTone="success"
      clubForm={{ atcSportclubId: "106" }}
      setClubForm={vi.fn()}
      emptyClubForm={{ atcSportclubId: "" }}
      cardClassName="section-card"
      runMutation={vi.fn()}
      {...overrides}
    />,
  );
}

describe("NetworkAdminCreateClubSection", () => {
  afterEach(() => {
    cleanup();
    sectionHeaderSpy.mockReset();
    createClubFormSpy.mockReset();
  });

  it("renders the extracted section shell and forwards child props", () => {
    const setClubForm = vi.fn();
    const runMutation = vi.fn();
    const emptyClubForm = { atcSportclubId: "" };
    const clubForm = { atcSportclubId: "106" };

    const { container } = renderSection({
      message: null,
      messageTone: "error",
      clubForm,
      setClubForm,
      emptyClubForm,
      runMutation,
    });

    expect((container.firstChild as HTMLElement | null)?.className).toContain("section-card");
    expect(screen.getByTestId("section-header")).toBeTruthy();
    expect(screen.getByTestId("create-club-form")).toBeTruthy();
    expect(sectionHeaderSpy).toHaveBeenCalledWith({ message: null, messageTone: "error" });
    expect(createClubFormSpy).toHaveBeenCalledWith(
      expect.objectContaining({
        busy: false,
        clubForm,
        setClubForm,
        emptyClubForm,
        runMutation,
      }),
    );
  });
});
