import { describe, it, expect, vi } from "vitest";
import { render, screen } from "@testing-library/react";
import { DomainList } from "./DomainList";
import type { Domain } from "@mosaic/shared";

describe("DomainList", (): void => {
  const mockDomains: Domain[] = [
    {
      id: "domain-1",
      workspaceId: "workspace-1",
      name: "Work",
      slug: "work",
      description: "Work-related tasks",
      color: "#3B82F6",
      icon: "💼",
      sortOrder: 0,
      metadata: {},
      createdAt: new Date("2026-01-28"),
      updatedAt: new Date("2026-01-28"),
    },
    {
      id: "domain-2",
      workspaceId: "workspace-1",
      name: "Personal",
      slug: "personal",
      description: "Personal tasks and projects",
      color: "#10B981",
      icon: "🏠",
      sortOrder: 1,
      metadata: {},
      createdAt: new Date("2026-01-28"),
      updatedAt: new Date("2026-01-28"),
    },
  ];

  it("should render empty state when no domains", (): void => {
    render(<DomainList domains={[]} isLoading={false} />);
    expect(screen.getByText(/no domains created yet/i)).toBeInTheDocument();
  });

  it("should render loading state", (): void => {
    render(<DomainList domains={[]} isLoading={true} />);
    expect(screen.getByText(/loading domains/i)).toBeInTheDocument();
  });

  it("should render domains list", (): void => {
    render(<DomainList domains={mockDomains} isLoading={false} />);
    expect(screen.getByText("Work")).toBeInTheDocument();
    expect(screen.getByText("Personal")).toBeInTheDocument();
  });

  it("should call onEdit when edit button clicked", (): void => {
    const onEdit = vi.fn();
    render(<DomainList domains={mockDomains} isLoading={false} onEdit={onEdit} />);

    const editButtons = screen.getAllByRole("button", { name: /edit/i });
    editButtons[0]!.click();
    expect(onEdit).toHaveBeenCalledWith(mockDomains[0]);
  });

  it("should call onDelete when delete button clicked", (): void => {
    const onDelete = vi.fn();
    render(<DomainList domains={mockDomains} isLoading={false} onDelete={onDelete} />);

    const deleteButtons = screen.getAllByRole("button", { name: /delete/i });
    deleteButtons[0]!.click();
    expect(onDelete).toHaveBeenCalledWith(mockDomains[0]);
  });

  it("should handle undefined domains gracefully", (): void => {
    // @ts-expect-error Testing error state
    render(<DomainList domains={undefined} isLoading={false} />);
    expect(screen.getByText(/no domains created yet/i)).toBeInTheDocument();
  });

  it("should handle null domains gracefully", (): void => {
    // @ts-expect-error Testing error state
    render(<DomainList domains={null} isLoading={false} />);
    expect(screen.getByText(/no domains created yet/i)).toBeInTheDocument();
  });
});
