import React from "react";
import { render, screen, fireEvent, waitFor } from "@testing-library/react";
import { ProductForm } from "@/components/dashboard/catalog/ProductForm";
import { describe, it, expect, vi, beforeEach } from "vitest";
import * as catalogActions from "@/actions/catalog";
import { useRouter } from "next/navigation";
import { toast } from "sonner";

// Mock next/navigation
vi.mock("next/navigation", () => ({
  useRouter: vi.fn(),
}));

// Mock catalog actions
vi.mock("@/actions/catalog", () => ({
  createProduct: vi.fn(),
  updateProduct: vi.fn(),
}));

// Mock sonner
vi.mock("sonner", () => ({
  toast: {
    success: vi.fn(),
    error: vi.fn(),
  },
}));

// Mock UniversalCombobox
vi.mock("@/components/dashboard/UniversalCombobox", () => ({
  UniversalCombobox: ({ label, value, onChange, options }: any) => (
    <div data-testid={`combobox-${label}`}>
      <label>{label}</label>
      <select value={value || ""} onChange={(e) => onChange(e.target.value)}>
        <option value="">Select...</option>
        {options.map((opt: any) => (
          <option key={opt.value} value={opt.value}>{opt.label}</option>
        ))}
      </select>
    </div>
  )
}));

// Mock ProductAttributesManager
vi.mock("./ProductAttributesManager", () => ({
  ProductAttributesManager: () => <div data-testid="attributes-manager">Attributes Manager</div>
}));

// Mock Shadcn Tabs to render everything at once for testing
vi.mock("@/components/ui/tabs", () => ({
  Tabs: ({ children }: any) => <div>{children}</div>,
  TabsList: ({ children }: any) => <div>{children}</div>,
  TabsTrigger: ({ children }: any) => <button>{children}</button>,
  TabsContent: ({ children }: any) => <div>{children}</div>,
}));

describe("ProductForm", () => {
  const mockPush = vi.fn();
  const mockRefresh = vi.fn();
  const mockBack = vi.fn();

  const mockProps = {
    categories: [{ id: "00000000-0000-0000-0000-000000000001", name: "Cat 1" }],
    brands: [{ id: "00000000-0000-0000-0000-000000000002", name: "Brand 1" }],
    manufacturers: [{ id: "00000000-0000-0000-0000-000000000003", company_name: "Man 1" }],
    suppliers: [{ id: "00000000-0000-0000-0000-000000000004", company_name: "Sup 1" }],
    taxClasses: [{ id: "00000000-0000-0000-0000-000000000005", name: "Tax 1" }],
    euResponsiblePersons: [{ id: "00000000-0000-0000-0000-000000000006", company_name: "EU 1" }],
  };

  beforeEach(() => {
    vi.clearAllMocks();
    (useRouter as any).mockReturnValue({
      push: mockPush,
      refresh: mockRefresh,
      back: mockBack,
    });
  });

  it("renders correctly for new product", () => {
    render(<ProductForm {...mockProps} />);
    expect(screen.getByText("Basis-Informationen")).toBeInTheDocument();
    expect(screen.getByLabelText(/Titel/i)).toBeInTheDocument();
    expect(screen.getByRole("button", { name: "Erstellen" })).toBeInTheDocument();
  });

  it("submits createProduct when creating a new product", async () => {
    (catalogActions.createProduct as any).mockResolvedValue({ success: true, data: { id: "00000000-0000-0000-0000-000000000000" }, message: "Success" });
    render(<ProductForm {...mockProps} />);

    // Fill "General" section
    fireEvent.change(screen.getByLabelText(/Interner Name/i), { target: { value: "Internal Name" } });
    fireEvent.change(screen.getByLabelText(/Anzeige-Titel/i), { target: { value: "New Product" } });
    fireEvent.change(screen.getByLabelText(/MPN/i), { target: { value: "MPN-NEW" } });
    
    // Fill "Inventory" section
    fireEvent.change(screen.getByLabelText(/SKU/i), { target: { value: "SKU-NEW" } });
    fireEvent.change(screen.getByLabelText(/Preis/i), { target: { value: "100" } });
    fireEvent.change(screen.getByLabelText(/Lagerbestand/i), { target: { value: "50" } });

    // Fill out mandatory organization fields (now visible due to mock)
    fireEvent.change(screen.getByTestId("combobox-Kategorie").querySelector("select")!, { target: { value: "00000000-0000-0000-0000-000000000001" } });
    fireEvent.change(screen.getByTestId("combobox-Marke").querySelector("select")!, { target: { value: "00000000-0000-0000-0000-000000000002" } });
    fireEvent.change(screen.getByTestId("combobox-Hersteller").querySelector("select")!, { target: { value: "00000000-0000-0000-0000-000000000003" } });
    fireEvent.change(screen.getByTestId("combobox-Lieferant").querySelector("select")!, { target: { value: "00000000-0000-0000-0000-000000000004" } });
    fireEvent.change(screen.getByTestId("combobox-Steuerklasse").querySelector("select")!, { target: { value: "00000000-0000-0000-0000-000000000005" } });
    fireEvent.change(screen.getByTestId("combobox-Verantwortlicher").querySelector("select")!, { target: { value: "00000000-0000-0000-0000-000000000006" } });

    fireEvent.click(screen.getByRole("button", { name: "Erstellen" }));

    await waitFor(() => {
      expect(catalogActions.createProduct).toHaveBeenCalledWith(expect.objectContaining({
        name: "Internal Name",
        sku: "SKU-NEW",
        price: 100,
        inventory: 50
      }));
      expect(mockPush).toHaveBeenCalledWith("/dashboard/products/overview");
    });
  });

  it("shows error toast on failure", async () => {
    (catalogActions.createProduct as any).mockResolvedValue({ success: false, error: "Validation failed", code: 400 });
    render(<ProductForm {...mockProps} />);

    fireEvent.change(screen.getByLabelText(/Interner Name/i), { target: { value: "Internal Name" } });
    fireEvent.change(screen.getByLabelText(/Anzeige-Titel/i), { target: { value: "New Product" } });
    fireEvent.change(screen.getByLabelText(/MPN/i), { target: { value: "MPN-NEW" } });
    
    // Fill "Inventory" section
    fireEvent.change(screen.getByLabelText(/SKU/i), { target: { value: "SKU-NEW" } });
    fireEvent.change(screen.getByLabelText(/Preis/i), { target: { value: "100" } });
    fireEvent.change(screen.getByLabelText(/Lagerbestand/i), { target: { value: "50" } });

    // Fill out mandatory organization fields
    fireEvent.change(screen.getByTestId("combobox-Kategorie").querySelector("select")!, { target: { value: "00000000-0000-0000-0000-000000000001" } });
    fireEvent.change(screen.getByTestId("combobox-Marke").querySelector("select")!, { target: { value: "00000000-0000-0000-0000-000000000002" } });
    fireEvent.change(screen.getByTestId("combobox-Hersteller").querySelector("select")!, { target: { value: "00000000-0000-0000-0000-000000000003" } });
    fireEvent.change(screen.getByTestId("combobox-Lieferant").querySelector("select")!, { target: { value: "00000000-0000-0000-0000-000000000004" } });
    fireEvent.change(screen.getByTestId("combobox-Steuerklasse").querySelector("select")!, { target: { value: "00000000-0000-0000-0000-000000000005" } });
    fireEvent.change(screen.getByTestId("combobox-Verantwortlicher").querySelector("select")!, { target: { value: "00000000-0000-0000-0000-000000000006" } });

    fireEvent.click(screen.getByRole("button", { name: "Erstellen" }));

    await waitFor(() => {
      expect(toast.error).toHaveBeenCalledWith("Validation failed");
    });
  });

  it("calls router.back when cancel button is clicked", () => {
    render(<ProductForm {...mockProps} />);
    fireEvent.click(screen.getByRole("button", { name: "Abbrechen" }));
    expect(mockBack).toHaveBeenCalled();
  });
});
