import {
  applyPromoAccessRoleHandler,
  createPromoAccessRoleHandler,
  deletePromoAccessRoleHandler,
  getPromoAccessRoleHandler,
  listPromoAccessRolesHandler,
  updatePromoAccessRoleHandler,
} from "@/controllers/admin/promo-access-roles/promo-access-roles.controller";
import { withConsoleUserRole } from "@/middlewares/console-role";
import { withConsoleUserSession } from "@/middlewares/withConsoleUserSession";
import { Hono } from "hono";

export const PromoAccessRolesRoutes = new Hono();

/*
 * Gated on `promocode-access-list`, not `role-management`.
 *
 * These roles grant promo-code and export *data* access. Someone who can manage
 * console roles (feature privileges) should not thereby be able to hand out data
 * access, and vice versa.
 *
 * "/apply" is declared before "/:id" so the static segment is not captured as a
 * role id.
 */
PromoAccessRolesRoutes.post(
  "/apply/:userId",
  withConsoleUserSession(),
  withConsoleUserRole("promocode-access-list", "update"),
  applyPromoAccessRoleHandler,
);

PromoAccessRolesRoutes.get(
  "/",
  withConsoleUserSession(),
  withConsoleUserRole("promocode-access-list", "read"),
  listPromoAccessRolesHandler,
);

PromoAccessRolesRoutes.post(
  "/",
  withConsoleUserSession(),
  withConsoleUserRole("promocode-access-list", "create"),
  createPromoAccessRoleHandler,
);

PromoAccessRolesRoutes.get(
  "/:id",
  withConsoleUserSession(),
  withConsoleUserRole("promocode-access-list", "read"),
  getPromoAccessRoleHandler,
);

PromoAccessRolesRoutes.put(
  "/:id",
  withConsoleUserSession(),
  withConsoleUserRole("promocode-access-list", "update"),
  updatePromoAccessRoleHandler,
);

PromoAccessRolesRoutes.delete(
  "/:id",
  withConsoleUserSession(),
  withConsoleUserRole("promocode-access-list", "delete"),
  deletePromoAccessRoleHandler,
);
