import { beforeEach, describe, expect, it, vi } from "vitest";
import { GET } from "./route";
import { ApiV1Error } from "@/lib/api-v1/errors";

const mocks = vi.hoisted(() => ({
  requireApiV1Auth: vi.fn(),
  listProducts: vi.fn(),
}));

vi.mock("@/lib/api-v1/auth", () => ({
  requireApiV1Auth: mocks.requireApiV1Auth,
}));

vi.mock("@/lib/api-v1/services/products-service", () => ({
  listProducts: mocks.listProducts,
}));

describe("GET /api/v1/products", () => {
  beforeEach(() => {
    vi.clearAllMocks();
  });

  it("retorna produtos filtrados", async () => {
    mocks.requireApiV1Auth.mockResolvedValue({
      supabase: {},
      user: { id: "user-1" },
    });
    mocks.listProducts.mockResolvedValue({
      ok: true,
      data: [{ id: "prod-1", name: "Caneca", price: 39.9 }],
      pagination: { page: 1, per_page: 20, total: 1 },
    });

    const response = await GET(new Request("http://localhost/api/v1/products?q=caneca"));
    expect(response.status).toBe(200);
    await expect(response.json()).resolves.toMatchObject({
      success: true,
      data: {
        items: [{ id: "prod-1", name: "Caneca" }],
      },
    });
  });

  it("nega acesso sem autenticacao", async () => {
    mocks.requireApiV1Auth.mockRejectedValue(new ApiV1Error(401, "missing_bearer_token", "Token Bearer obrigatorio."));

    const response = await GET(new Request("http://localhost/api/v1/products"));
    expect(response.status).toBe(401);
    await expect(response.json()).resolves.toMatchObject({
      success: false,
      error: { code: "missing_bearer_token" },
    });
  });
});
