import { describe, it, expect } from "vitest";

describe("Cancel request feature", () => {
  describe("Cancel procedure validation", () => {
    it("should define the cancel procedure in the request router", async () => {
      const { appRouter } = await import("./routers");
      // Verify the cancel procedure exists
      expect(appRouter._def.procedures).toHaveProperty("request.cancel");
    }, 15000);

    it("should have cancel as a callable procedure", async () => {
      const { appRouter } = await import("./routers");
      const procedure = (appRouter._def.procedures as any)["request.cancel"];
      expect(procedure).toBeDefined();
      expect(procedure._def).toBeDefined();
    }, 15000);
  });

  describe("Schema validation", () => {
    it("should include 'annulee' in request statuses", async () => {
      const { requestStatuses } = await import("../drizzle/schema");
      expect(requestStatuses).toContain("annulee");
    });

    it("should include 'annulation' in request history actions", async () => {
      const { requestHistory } = await import("../drizzle/schema");
      const actionColumn = requestHistory.action;
      // Verify the column exists and has the right enum values
      expect(actionColumn).toBeDefined();
      expect(actionColumn.enumValues).toContain("annulation");
    });

    it("should include 'annulation_demande' in admin notification types", async () => {
      const { adminNotifications } = await import("../drizzle/schema");
      const typeColumn = adminNotifications.type;
      expect(typeColumn).toBeDefined();
      expect(typeColumn.enumValues).toContain("annulation_demande");
    });

    it("should include 'modification_demande' in admin notification types", async () => {
      const { adminNotifications } = await import("../drizzle/schema");
      const typeColumn = adminNotifications.type;
      expect(typeColumn).toBeDefined();
      expect(typeColumn.enumValues).toContain("modification_demande");
    });
  });

  describe("Update procedure with notification", () => {
    it("should define the update procedure in the request router", async () => {
      const { appRouter } = await import("./routers");
      expect(appRouter._def.procedures).toHaveProperty("request.update");
    }, 15000);

    it("should have update as a callable procedure", async () => {
      const { appRouter } = await import("./routers");
      const procedure = (appRouter._def.procedures as any)["request.update"];
      expect(procedure).toBeDefined();
      expect(procedure._def).toBeDefined();
    }, 15000);
  });

  describe("Calendar integration", () => {
    it("getApprovedReservations should only return validated requests (not annulee)", async () => {
      // The getApprovedReservations function filters by status = 'validee'
      // so cancelled requests are automatically excluded from the calendar
      const dbModule = await import("./db");
      expect(typeof dbModule.getApprovedReservations).toBe("function");
    });
  });
});
