// Tag CRUD 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;
let createdId: string;

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

  // Register and login to get a token
  const regRes = await app.inject({
    method: "POST",
    url: "/api/auth/register",
    payload: { username: `test_${Date.now()}`, password: "password123" },
  });
  token = regRes.json().token;
});

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

describe("GET /api/tags", () => {
  it("returns empty list", async () => {
    const res = await app.inject({
      method: "GET",
      url: "/api/tags",
      headers: { authorization: `Bearer ${token}` },
    });
    assert.equal(res.statusCode, 200);
    const body = res.json();
    assert.ok(Array.isArray(body.data));
  });
});

describe("POST /api/tags", () => {
  it("creates a tag", async () => {
    const res = await app.inject({
      method: "POST",
      url: "/api/tags",
      headers: { authorization: `Bearer ${token}` },
      payload: {
        "name": "sample-name",
        "color": "sample-color"
      },
    });
    assert.equal(res.statusCode, 201);
    const body = res.json();
    assert.ok(body.data.id);
    createdId = body.data.id;
  });
});

describe("GET /api/tags/:id", () => {
  it("returns the created tag", async () => {
    const res = await app.inject({
      method: "GET",
      url: `/api/tags/${createdId}`,
      headers: { authorization: `Bearer ${token}` },
    });
    assert.equal(res.statusCode, 200);
    const body = res.json();
    assert.equal(body.data.id, createdId);
  });

  it("returns 404 for nonexistent id", async () => {
    const res = await app.inject({
      method: "GET",
      url: `/api/tags/nonexistent`,
      headers: { authorization: `Bearer ${token}` },
    });
    assert.equal(res.statusCode, 404);
  });
});

describe("PUT /api/tags/:id", () => {
  it("updates the tag", async () => {
    const res = await app.inject({
      method: "PUT",
      url: `/api/tags/${createdId}`,
      headers: { authorization: `Bearer ${token}` },
      payload: {
        "name": "sample-name",
        "color": "sample-color"
      },
    });
    assert.equal(res.statusCode, 200);
  });
});

describe("DELETE /api/tags/:id", () => {
  it("deletes the tag", async () => {
    const res = await app.inject({
      method: "DELETE",
      url: `/api/tags/${createdId}`,
      headers: { authorization: `Bearer ${token}` },
    });
    assert.equal(res.statusCode, 204);
  });

  it("returns 404 after delete", async () => {
    const res = await app.inject({
      method: "GET",
      url: `/api/tags/${createdId}`,
      headers: { authorization: `Bearer ${token}` },
    });
    assert.equal(res.statusCode, 404);
  });
});
