// ApprovalStep 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/approval_steps", () => {
  it("returns empty list", async () => {
    const res = await app.inject({
      method: "GET",
      url: "/api/approval_steps",
      headers: { authorization: `Bearer ${token}` },
    });
    assert.equal(res.statusCode, 200);
    const body = res.json();
    assert.ok(Array.isArray(body.data));
  });
});

describe("POST /api/approval_steps", () => {
  it("creates a approval_step", async () => {
    const res = await app.inject({
      method: "POST",
      url: "/api/approval_steps",
      headers: { authorization: `Bearer ${token}` },
      payload: {
        "approvalId": "00000000-0000-0000-0000-000000000001",
        "approverId": "00000000-0000-0000-0000-000000000001",
        "stepOrder": 1,
        "status": "sample-status",
        "comment": "sample-comment",
        "actedAt": "sample-actedat"
      },
    });
    assert.equal(res.statusCode, 201);
    const body = res.json();
    assert.ok(body.data.id);
    createdId = body.data.id;
  });
});

describe("GET /api/approval_steps/:id", () => {
  it("returns the created approval_step", async () => {
    const res = await app.inject({
      method: "GET",
      url: `/api/approval_steps/${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/approval_steps/nonexistent`,
      headers: { authorization: `Bearer ${token}` },
    });
    assert.equal(res.statusCode, 404);
  });
});

describe("PUT /api/approval_steps/:id", () => {
  it("updates the approval_step", async () => {
    const res = await app.inject({
      method: "PUT",
      url: `/api/approval_steps/${createdId}`,
      headers: { authorization: `Bearer ${token}` },
      payload: {
        "approvalId": "00000000-0000-0000-0000-000000000001",
        "approverId": "00000000-0000-0000-0000-000000000001",
        "stepOrder": 1,
        "status": "sample-status",
        "comment": "sample-comment",
        "actedAt": "sample-actedat"
      },
    });
    assert.equal(res.statusCode, 200);
  });
});

describe("DELETE /api/approval_steps/:id", () => {
  it("deletes the approval_step", async () => {
    const res = await app.inject({
      method: "DELETE",
      url: `/api/approval_steps/${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/approval_steps/${createdId}`,
      headers: { authorization: `Bearer ${token}` },
    });
    assert.equal(res.statusCode, 404);
  });
});
