import { Hono } from "hono";
import {
    createCampaignHandler,
    getCampaignHandler,
    sendCampaignHandler,
    listCampaignsHandler,
    campaignsAnalyticsHandler,
    getTargetMetadataHandler,
    updateCampaignHandler,
    sendTestCampaignHandler,
    getAudienceCountHandler,
    deleteCampaignHandler,
    stopCampaignHandler,
    resumeCampaignHandler,
    getCampaignRecipientsHandler,
    getAudienceMembersHandler,
    activateCampaignHandler,
    listBlockedEmailsHandler,
    createBlockedEmailHandler,
    deleteBlockedEmailHandler,
    toggleBlockedEmailHandler,
    listDefaultEmailsHandler,
    addDefaultEmailHandler,
    deleteDefaultEmailHandler,
} from "@/controllers/admin/notifications/campaign.controller";

import { withConsoleUserSession } from "@/middlewares/withConsoleUserSession";
import { redisCacheMiddleware } from "@/middlewares/redis-cache.middleware";

export const NotificationRoutes = new Hono();

NotificationRoutes.get(
    "/options",
    withConsoleUserSession(),
    redisCacheMiddleware({ ttl: 3600 }),
    getTargetMetadataHandler
);

NotificationRoutes.post(
    "/audience/count",
    withConsoleUserSession(),
    getAudienceCountHandler
);

NotificationRoutes.post(
    "/audience/members",
    withConsoleUserSession(),
    getAudienceMembersHandler
);

NotificationRoutes.post("/campaigns/test", withConsoleUserSession(), sendTestCampaignHandler);

NotificationRoutes.post("/campaigns", withConsoleUserSession(), createCampaignHandler);

NotificationRoutes.patch("/campaigns/:id", withConsoleUserSession(), updateCampaignHandler);

NotificationRoutes.post("/campaigns/:id/send", withConsoleUserSession(), sendCampaignHandler);

NotificationRoutes.delete("/campaigns/:id", withConsoleUserSession(), deleteCampaignHandler);

NotificationRoutes.post("/campaigns/:id/activate", withConsoleUserSession(), activateCampaignHandler);

NotificationRoutes.post("/campaigns/:id/stop", withConsoleUserSession(), stopCampaignHandler);

NotificationRoutes.post("/campaigns/:id/resume", withConsoleUserSession(), resumeCampaignHandler);

NotificationRoutes.get("/campaigns/:id/recipients", withConsoleUserSession(), getCampaignRecipientsHandler);

NotificationRoutes.get(
    "/campaigns",
    withConsoleUserSession(),
    redisCacheMiddleware({ ttl: 300 }),
    listCampaignsHandler
);

// Declared before "/campaigns/:id" so the static segment isn't captured as a campaign id.
NotificationRoutes.get(
    "/campaigns/analytics",
    withConsoleUserSession(),
    redisCacheMiddleware({ ttl: 3600 }),
    campaignsAnalyticsHandler
);

NotificationRoutes.get(
    "/campaigns/:id",
    withConsoleUserSession(),
    getCampaignHandler
);

NotificationRoutes.get("/blocked-emails", withConsoleUserSession(), listBlockedEmailsHandler);
NotificationRoutes.post("/blocked-emails", withConsoleUserSession(), createBlockedEmailHandler);
NotificationRoutes.delete("/blocked-emails/:id", withConsoleUserSession(), deleteBlockedEmailHandler);
NotificationRoutes.patch("/blocked-emails/:id/toggle", withConsoleUserSession(), toggleBlockedEmailHandler);

// Default Emails
NotificationRoutes.get("/default-emails", withConsoleUserSession(), listDefaultEmailsHandler);
NotificationRoutes.post("/default-emails", withConsoleUserSession(), addDefaultEmailHandler);
NotificationRoutes.delete("/default-emails/:id", withConsoleUserSession(), deleteDefaultEmailHandler);
