import { beforeEach, describe, expect, it, vi } from "vitest";
import { prisma, __resetPrisma } from "../mocks/prisma";

const checkAdminAuth = vi.fn();
const authCheckPath = vi.hoisted(() => new URL("../../lib/auth-check.ts", import.meta.url).pathname);
const prismaPath = vi.hoisted(() => new URL("../../lib/prisma.ts", import.meta.url).pathname);
vi.mock(authCheckPath, () => ({ checkAdminAuth }));
vi.mock(prismaPath, () => ({ prisma }));

beforeEach(async () => {
  await vi.resetModules();
  __resetPrisma();
  checkAdminAuth.mockResolvedValue(null);
});

describe("Admin reviews API", () => {
  it("GET /api/admin/reviews returns reviews", async () => {
    prisma.review.findMany.mockResolvedValueOnce([{ id: "r1" }]);
    const { GET } = await import("../../app/api/admin/reviews/route");

    const res = await GET();
    const data = await res.json();

    expect(data).toHaveLength(1);
  });

  it("PUT /api/admin/reviews/[id] updates review", async () => {
    prisma.review.update.mockResolvedValueOnce({ id: "r1" });
    const { PUT } = await import("../../app/api/admin/reviews/[id]/route");

    const res = await PUT(
      new Request("http://localhost/api/admin/reviews/r1", {
        method: "PUT",
        body: JSON.stringify({ status: "approved" }),
        headers: { "content-type": "application/json" },
      }),
      { params: Promise.resolve({ id: "r1" }) }
    );

    expect(res.status).toBe(200);
  });

  it("DELETE /api/admin/reviews/[id] deletes review", async () => {
    prisma.review.delete.mockResolvedValueOnce({ id: "r1" });
    const { DELETE } = await import("../../app/api/admin/reviews/[id]/route");

    const res = await DELETE(new Request("http://localhost/api/admin/reviews/r1"), {
      params: Promise.resolve({ id: "r1" }),
    });

    const data = await res.json();
    expect(data.success).toBe(true);
  });
});
