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

describe("POST /api/schedules", () => {
  it("creates a schedule", async () => {
    const res = await app.inject({
      method: "POST",
      url: "/api/schedules",
      headers: { authorization: `Bearer ${token}` },
      payload: {
        "petId": "00000000-0000-0000-0000-000000000001",
        "type": "sample-type",
        "title": "sample-title",
        "scheduledAt": "sample-scheduledat",
        "completed": true
      },
    });
    assert.equal(res.statusCode, 201);
    const body = res.json();
    assert.ok(body.data.id);
    createdId = body.data.id;
  });
});

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

describe("PUT /api/schedules/:id", () => {
  it("updates the schedule", async () => {
    const res = await app.inject({
      method: "PUT",
      url: `/api/schedules/${createdId}`,
      headers: { authorization: `Bearer ${token}` },
      payload: {
        "petId": "00000000-0000-0000-0000-000000000001",
        "type": "sample-type",
        "title": "sample-title",
        "scheduledAt": "sample-scheduledat",
        "completed": true
      },
    });
    assert.equal(res.statusCode, 200);
  });
});

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