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/login", () => {
  const signInWithPassword = vi.fn();

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

  it("retorna sessao ao autenticar com sucesso", async () => {
    signInWithPassword.mockResolvedValue({
      data: {
        session: {
          access_token: "token-1",
          refresh_token: "refresh-1",
        },
      },
      error: null,
    });

    const response = await POST(
      new Request("http://localhost/api/v1/auth/login", {
        method: "POST",
        body: JSON.stringify({
          email: "user@example.com",
          password: "secret",
        }),
      })
    );

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