import { beforeEach, describe, expect, it, vi } from "vitest";
import { POST } from "./route";

const mocks = vi.hoisted(() => ({
  createExternalSupabaseClient: vi.fn(),
  buildSessionPayload: vi.fn(),
}));

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

describe("POST /api/v1/auth/refresh", () => {
  const refreshSession = vi.fn();

  beforeEach(() => {
    vi.clearAllMocks();
    mocks.createExternalSupabaseClient.mockReturnValue({
      auth: {
        refreshSession,
      },
    });
    mocks.buildSessionPayload.mockResolvedValue({
      access_token: "token-2",
      refresh_token: "refresh-2",
      token_type: "bearer",
      expires_at: 1763631112,
      user: { id: "user-1", email: "user@example.com" },
      company: { id: "company-1", owner_id: "owner-1", tenant_ids: ["company-1"], permissions: ["quotes.write"] },
    });
  });

  it("renova a sessao com refresh token valido", async () => {
    refreshSession.mockResolvedValue({
      data: {
        session: {
          access_token: "token-2",
          refresh_token: "refresh-2",
        },
      },
      error: null,
    });

    const response = await POST(
      new Request("http://localhost/api/v1/auth/refresh", {
        method: "POST",
        body: JSON.stringify({ refresh_token: "refresh-1" }),
      })
    );

    expect(response.status).toBe(200);
    await expect(response.json()).resolves.toMatchObject({
      success: true,
      data: {
        session: {
          access_token: "token-2",
          refresh_token: "refresh-2",
        },
      },
    });
  });

  it("retorna erro amigavel quando refresh token nao e enviado", async () => {
    const response = await POST(
      new Request("http://localhost/api/v1/auth/refresh", {
        method: "POST",
        body: JSON.stringify({}),
      })
    );

    expect(response.status).toBe(400);
    await expect(response.json()).resolves.toMatchObject({
      success: false,
      error: {
        code: "missing_refresh_token",
      },
    });
  });
});
