// InspectionPlans 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;
let payload: Record<string, unknown>;

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;

  // Create a real equipment first so FK reference is valid
  const eqRes = await app.inject({
    method: "POST",
    url: "/api/equipment",
    headers: { authorization: `Bearer ${token}` },
    payload: { name: "test-eq", code: `EQ_${Date.now()}`, location: "lab" },
  });
  const eqId = eqRes.json().data?.id || eqRes.json().id;

  payload = {
    userId: regRes.json().user.id,
    name: "sample-name",
    frequency: "sample-frequency",
    equipmentId: eqId,
    nextRun: "sample-nextrun",
  };
});

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

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

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

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

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

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