import { Hono } from "hono";
import { withConsoleUserSession } from "@/middlewares/withConsoleUserSession";
import { withConsoleUserRole } from "@/middlewares/console-role";
import { ResortController } from "@/controllers/admin/resorts/resorts.controller";

export const ResortRoutes = new Hono();

ResortRoutes.get(
  "/meta/unit-types",
  withConsoleUserSession(),
  withConsoleUserRole("resorts", "read"),
  async (ctx) => ResortController(ctx).GetUnitTypes(),
);

ResortRoutes.get(
  "/",
  withConsoleUserSession(),
  withConsoleUserRole("resorts", "read"),
  async (ctx) => ResortController(ctx).ListResorts(),
);

ResortRoutes.post(
  "/",
  withConsoleUserSession(),
  withConsoleUserRole("resorts", "create"),
  async (ctx) => ResortController(ctx).CreateResort(),
);

ResortRoutes.post(
  "/sync",
  withConsoleUserSession(),
  withConsoleUserRole("resorts", "update"),
  async (ctx) => ResortController(ctx).SyncResorts(),
);

ResortRoutes.post(
  "/sync-json",
  withConsoleUserSession(),
  withConsoleUserRole("resorts", "update"),
  async (ctx) => ResortController(ctx).SyncJsonConfig(),
);


ResortRoutes.get(
  "/:id",
  withConsoleUserSession(),
  withConsoleUserRole("resorts", "read"),
  async (ctx) => ResortController(ctx).GetResort(),
);

ResortRoutes.put(
  "/:id",
  withConsoleUserSession(),
  withConsoleUserRole("resorts", "update"),
  async (ctx) => ResortController(ctx).UpdateResort(),
);

ResortRoutes.delete(
  "/:id",
  withConsoleUserSession(),
  withConsoleUserRole("resorts", "delete"),
  async (ctx) => ResortController(ctx).DeleteResort(),
);

ResortRoutes.get(
  "/:id/units",
  withConsoleUserSession(),
  withConsoleUserRole("resorts", "read"),
  async (ctx) => ResortController(ctx).ListResortUnits(),
);

ResortRoutes.post(
  "/:id/units",
  withConsoleUserSession(),
  withConsoleUserRole("resorts", "update"),
  async (ctx) => ResortController(ctx).CreateResortUnit(),
);

ResortRoutes.put(
  "/:id/units/:unitId",
  withConsoleUserSession(),
  withConsoleUserRole("resorts", "update"),
  async (ctx) => ResortController(ctx).UpdateResortUnit(),
);

ResortRoutes.delete(
  "/:id/units/:unitId",
  withConsoleUserSession(),
  withConsoleUserRole("resorts", "update"),
  async (ctx) => ResortController(ctx).DeleteResortUnit(),
);

ResortRoutes.get(
  "/:id/units/eligible",
  withConsoleUserSession(),
  withConsoleUserRole("resorts", "read"),
  async (ctx) => ResortController(ctx).GetEligibleUnits(),
);
