// Auth routes test
import { describe, it, before, after } from "node:test";
import assert from "node:assert/strict";
import { buildApp } from "../index.js";
import type { FastifyInstance } from "fastify";

let app: FastifyInstance;
let token: string;

before(async () => {
  process.env.JWT_SECRET = "test-secret";
  process.env.DATABASE_URL = ":memory:";
  app = await buildApp();
  await app.ready();
});

after(async () => {
  await app.close();
});

describe("POST /api/auth/register", () => {
  it("registers a new user", async () => {
    const res = await app.inject({
      method: "POST",
      url: "/api/auth/register",
      payload: { username: "testuser", password: "password123" },
    });
    assert.equal(res.statusCode, 201);
    const body = res.json();
    assert.ok(body.token);
    assert.equal(body.user.username, "testuser");
    token = body.token;
  });

  it("rejects duplicate username", async () => {
    const res = await app.inject({
      method: "POST",
      url: "/api/auth/register",
      payload: { username: "testuser", password: "password123" },
    });
    assert.equal(res.statusCode, 409);
  });

  it("rejects short password", async () => {
    const res = await app.inject({
      method: "POST",
      url: "/api/auth/register",
      payload: { username: "user2", password: "123" },
    });
    assert.equal(res.statusCode, 400);
  });
});

describe("POST /api/auth/login", () => {
  it("logs in with correct credentials", async () => {
    const res = await app.inject({
      method: "POST",
      url: "/api/auth/login",
      payload: { username: "testuser", password: "password123" },
    });
    assert.equal(res.statusCode, 200);
    const body = res.json();
    assert.ok(body.token);
    token = body.token;
  });

  it("rejects wrong password", async () => {
    const res = await app.inject({
      method: "POST",
      url: "/api/auth/login",
      payload: { username: "testuser", password: "wrongpassword" },
    });
    assert.equal(res.statusCode, 401);
  });
});

describe("GET /api/auth/me", () => {
  it("returns current user with valid token", async () => {
    const res = await app.inject({
      method: "GET",
      url: "/api/auth/me",
      headers: { authorization: `Bearer ${token}` },
    });
    assert.equal(res.statusCode, 200);
    const body = res.json();
    assert.equal(body.data.username, "testuser");
  });

  it("rejects without token", async () => {
    const res = await app.inject({
      method: "GET",
      url: "/api/auth/me",
    });
    assert.equal(res.statusCode, 401);
  });
});
