import { describe, it, expect, vi } from "vitest";
import React from "react";
import { render } from "@testing-library/react";
import { Logo } from "@/components/header/Logo";
import { OrderStatusBadge } from "@/components/dashboard/OrderStatusBadge";
import { FulfillmentStatusBadge } from "@/components/dashboard/FulfillmentStatusBadge";
import { PaymentStatusBadge } from "@/components/dashboard/PaymentStatusBadge";
import { UniversalInput } from "@/components/dashboard/UniversalInput";

// Mock next/image
const ImageMock = vi.fn(({ priority, ...props }: any) => {
  // eslint-disable-next-line @next/next/no-img-element
  return <img {...props} alt="" data-priority={priority ? "true" : undefined} />;
});

vi.mock("next/image", () => ({
  __esModule: true,
  default: (props: any) => ImageMock(props),
}));

// Mock next/navigation
vi.mock("next/navigation", () => ({
  useRouter: () => ({
    push: vi.fn(),
    refresh: vi.fn(),
  }),
  usePathname: () => "/",
  useSearchParams: () => new URLSearchParams(),
}));

describe("Performance Optimizations", () => {
  describe("Component Memoization", () => {
    it("OrderStatusBadge should be memoized", () => {
      expect(OrderStatusBadge.displayName).toBe("OrderStatusBadge");
      // React.memo components have a '$$typeof' property set to Symbol.for("react.memo")
      expect((OrderStatusBadge as any).$$typeof).toBe(Symbol.for("react.memo"));
    });

    it("FulfillmentStatusBadge should be memoized", () => {
      expect((FulfillmentStatusBadge as any).$$typeof).toBe(Symbol.for("react.memo"));
      expect(FulfillmentStatusBadge.displayName).toBe("FulfillmentStatusBadge");
    });

    it("PaymentStatusBadge should be memoized", () => {
      expect((PaymentStatusBadge as any).$$typeof).toBe(Symbol.for("react.memo"));
      expect(PaymentStatusBadge.displayName).toBe("PaymentStatusBadge");
    });

    it("UniversalInput should be memoized", () => {
      expect((UniversalInput as any).$$typeof).toBe(Symbol.for("react.memo"));
      expect(UniversalInput.displayName).toBe("UniversalInput");
    });
  });
});
