import { Hono } from "hono";
import { withConsoleUserSession } from "@/middlewares/withConsoleUserSession";
import { withConsoleUserRole } from "@/middlewares/console-role";
import {
  listEDMHandler,
  getEDMHandler,
  createEDMHandler,
  updateEDMHandler,
  deleteEDMHandler,
  sendEDMTestHandler,
  previewEDMHandler,
} from "@/controllers/admin/edm/edm.controller";
import {
  listEDMFoldersHandler,
  browseEDMFolderHandler,
  createEDMFolderHandler,
  updateEDMFolderHandler,
  deleteEDMFolderHandler,
  scanEDMImagesHandler,
  uploadEDMAssetHandler,
  deleteEDMAssetHandler,
  deleteEDMFolderImagesHandler,
  resolveEDMHtmlHandler,
  importEDMBundleHandler,
  batchImportEDMHandler,
  getEDMStorageTargetHandler,
  putEDMStorageTargetHandler,
} from "@/controllers/admin/edm/edm-workflow.controller";

export const EDMRoutes = new Hono();

// Public route for sharing HTML preview (no session required)
EDMRoutes.get("/:templateId/preview", previewEDMHandler);

// ── authoring workflow ──────────────────────────────────────────────────────
// Declared before the "/:templateId" routes below: Hono matches in
// registration order, so "/folders" would otherwise be swallowed by
// "/:templateId" and arrive as a template lookup for the id "folders".

EDMRoutes.get("/folders", withConsoleUserSession(), withConsoleUserRole("edm", "read"), listEDMFoldersHandler);
// One folder's own contents: subfolders, templates, and the images they use.
EDMRoutes.get("/browse", withConsoleUserSession(), withConsoleUserRole("edm", "read"), browseEDMFolderHandler);
EDMRoutes.post("/folders", withConsoleUserSession(), withConsoleUserRole("edm", "create"), createEDMFolderHandler);
EDMRoutes.patch("/folders/:folderId", withConsoleUserSession(), withConsoleUserRole("edm", "update"), updateEDMFolderHandler);
EDMRoutes.delete("/folders/:folderId", withConsoleUserSession(), withConsoleUserRole("edm", "delete"), deleteEDMFolderHandler);
// Empties a folder's images/ subfolder, leaving its templates alone.
EDMRoutes.delete("/folders/:folderId/images", withConsoleUserSession(), withConsoleUserRole("edm", "delete"), deleteEDMFolderImagesHandler);

/**
 * Where new EDMs are stored. Read needs only EDM access — it changes what
 * "create" does. The write is gated on super admin inside the handler rather
 * than on an EDM permission: it is one console-wide setting, not a per-feature
 * grant, so "can edit EDMs" must not imply "can move everyone's storage".
 */
EDMRoutes.get("/storage-target", withConsoleUserSession(), withConsoleUserRole("edm", "read"), getEDMStorageTargetHandler);
EDMRoutes.put("/storage-target", withConsoleUserSession(), putEDMStorageTargetHandler);

// Read-only analysis of pasted html — no storage, safe to call repeatedly.
EDMRoutes.post("/scan-images", withConsoleUserSession(), withConsoleUserRole("edm", "read"), scanEDMImagesHandler);

// Writes to the public asset bucket, so gated on "create" rather than "read".
EDMRoutes.post("/assets", withConsoleUserSession(), withConsoleUserRole("edm", "create"), uploadEDMAssetHandler);
// Irreversible, and a URL may already be embedded in delivered mail.
EDMRoutes.delete("/assets", withConsoleUserSession(), withConsoleUserRole("edm", "delete"), deleteEDMAssetHandler);
EDMRoutes.post("/resolve", withConsoleUserSession(), withConsoleUserRole("edm", "create"), resolveEDMHtmlHandler);
// Preview only — accepts a zip or a bare .html, stores nothing.
EDMRoutes.post("/import", withConsoleUserSession(), withConsoleUserRole("edm", "create"), importEDMBundleHandler);
// Commits: mirrors the archive's folder layout and creates one template per html.
EDMRoutes.post("/import-batch", withConsoleUserSession(), withConsoleUserRole("edm", "create"), batchImportEDMHandler);

EDMRoutes.get("/", withConsoleUserSession(), withConsoleUserRole("edm", "read"), listEDMHandler);
EDMRoutes.get("/:templateId", withConsoleUserSession(), withConsoleUserRole("edm", "read"), getEDMHandler);
EDMRoutes.post("/", withConsoleUserSession(), withConsoleUserRole("edm", "create"), createEDMHandler);
EDMRoutes.post("/:templateId/send-test", withConsoleUserSession(), withConsoleUserRole("edm", "read"), sendEDMTestHandler);
EDMRoutes.patch("/:templateId", withConsoleUserSession(), withConsoleUserRole("edm", "update"), updateEDMHandler);
EDMRoutes.delete("/:templateId", withConsoleUserSession(), withConsoleUserRole("edm", "delete"), deleteEDMHandler);

