import { router, publicProcedure, protectedProcedure } from "../_core/trpc.ts";
import { z } from "zod";
import {
  getActivePopups,
  recordPopupView,
  getPopupAnalytics,
  createPopup,
  deletePopup,
  updatePopup,
} from "../services/popupNotificationService.ts";

export const popupRouter = router({
  // Get active pop-ups for current user
  getActive: publicProcedure.query(async ({ ctx }) => {
    try {
      const userId = ctx.user?.id || 0;
      const popups = await getActivePopups(userId);
      return popups;
    } catch (error) {
      console.error("[POPUP] Error fetching active popups:", error);
      return [];
    }
  }),

  // Record pop-up view/interaction
  recordView: publicProcedure
    .input(
      z.object({
        popupId: z.number(),
        action: z.enum(["viewed", "dismissed", "clicked"]),
      })
    )
    .mutation(async ({ input, ctx }) => {
      try {
        const userId = ctx.user?.id || 0;
        const result = await recordPopupView(userId, input.popupId, input.action);
        return result;
      } catch (error) {
        console.error("[POPUP] Error recording view:", error);
        return { success: false };
      }
    }),

  // Get analytics for a specific pop-up (admin only)
  getAnalytics: protectedProcedure
    .input(z.object({ popupId: z.number() }))
    .query(async ({ input, ctx }) => {
      try {
        // Check if user is admin
        if (ctx.user?.role !== "admin") {
          throw new Error("Unauthorized");
        }
        const analytics = await getPopupAnalytics(input.popupId);
        return analytics;
      } catch (error) {
        console.error("[POPUP] Error fetching analytics:", error);
        return { views: 0, dismissals: 0, clicks: 0, ctr: 0 };
      }
    }),

  // Create new pop-up (admin only)
  create: protectedProcedure
    .input(
      z.object({
        title: z.string().min(1),
        description: z.string().min(1),
        type: z.enum(["game_release", "promotion", "announcement", "limited_time"]),
        imageUrl: z.string().optional(),
        ctaText: z.string(),
        ctaLink: z.string(),
        targetSegments: z.array(z.string()),
        startDate: z.date(),
        endDate: z.date(),
        priority: z.enum(["low", "medium", "high"]),
        dismissible: z.boolean().default(true),
      })
    )
    .mutation(async ({ input, ctx }) => {
      try {
        if (ctx.user?.role !== "admin") {
          throw new Error("Unauthorized");
        }
        const result = await createPopup(input);
        return result;
      } catch (error) {
        console.error("[POPUP] Error creating popup:", error);
        return {
          success: false,
          error: error instanceof Error ? error.message : "Unknown error",
        };
      }
    }),

  // Update pop-up (admin only)
  update: protectedProcedure
    .input(
      z.object({
        popupId: z.number(),
        title: z.string().optional(),
        description: z.string().optional(),
        type: z.enum(["game_release", "promotion", "announcement", "limited_time"]).optional(),
        imageUrl: z.string().optional(),
        ctaText: z.string().optional(),
        ctaLink: z.string().optional(),
        targetSegments: z.array(z.string()).optional(),
        startDate: z.date().optional(),
        endDate: z.date().optional(),
        priority: z.enum(["low", "medium", "high"]).optional(),
        dismissible: z.boolean().optional(),
      })
    )
    .mutation(async ({ input, ctx }) => {
      try {
        if (ctx.user?.role !== "admin") {
          throw new Error("Unauthorized");
        }
        const { popupId, ...updates } = input;
        const result = await updatePopup(popupId, updates);
        return result;
      } catch (error) {
        console.error("[POPUP] Error updating popup:", error);
        return { success: false };
      }
    }),

  // Delete pop-up (admin only)
  delete: protectedProcedure
    .input(z.object({ popupId: z.number() }))
    .mutation(async ({ input, ctx }) => {
      try {
        if (ctx.user?.role !== "admin") {
          throw new Error("Unauthorized");
        }
        const result = await deletePopup(input.popupId);
        return result;
      } catch (error) {
        console.error("[POPUP] Error deleting popup:", error);
        return { success: false };
      }
    }),
});
