import { router, protectedProcedure } from '../_core/trpc.js.ts';
import { z } from 'zod';
import OneTimePopupService from '../oneTimePopupService.js';

const oneTimePopupService = new OneTimePopupService();

export const oneTimePopupRouter = router({
  /**
   * Get active announcement for user on login
   */
  getActiveAnnouncement: protectedProcedure.query(({ ctx }) => {
    const announcement = oneTimePopupService.getActiveAnnouncement(ctx.user.id, ctx.user.role);
    return announcement;
  }),

  /**
   * Mark announcement as viewed
   */
  markAsViewed: protectedProcedure
    .input(z.object({ announcementId: z.string() }))
    .mutation(({ input, ctx }) => {
      const success = oneTimePopupService.markAsViewed(ctx.user.id, input.announcementId);
      return { success };
    }),

  /**
   * Get user's view history
   */
  getViewHistory: protectedProcedure.query(({ ctx }) => {
    return oneTimePopupService.getUserViewHistory(ctx.user.id);
  }),

  /**
   * Create announcement (admin only)
   */
  createAnnouncement: protectedProcedure
    .input(
      z.object({
        title: z.string().min(1).max(200),
        content: z.string().min(1).max(2000),
        type: z.enum(['info', 'warning', 'success', 'error']),
        imageUrl: z.string().optional(),
        ctaText: z.string().optional(),
        ctaUrl: z.string().optional(),
        expiresAt: z.date().optional(),
        targetAudience: z.enum(['all', 'new_players', 'vip', 'inactive']).optional(),
      })
    )
    .mutation(({ input, ctx }) => {
      // Check if user is admin
      if (ctx.user.role !== 'admin') {
        throw new Error('Unauthorized');
      }

      return oneTimePopupService.createAnnouncement({
        ...input,
        targetAudience: input.targetAudience || 'all',
      });
    }),

  /**
   * Get all announcements (admin only)
   */
  getAllAnnouncements: protectedProcedure.query(({ ctx }) => {
    // Check if user is admin
    if (ctx.user.role !== 'admin') {
      throw new Error('Unauthorized');
    }

    return oneTimePopupService.getAllAnnouncements();
  }),

  /**
   * Update announcement (admin only)
   */
  updateAnnouncement: protectedProcedure
    .input(
      z.object({
        id: z.string(),
        title: z.string().optional(),
        content: z.string().optional(),
        type: z.enum(['info', 'warning', 'success', 'error']).optional(),
        imageUrl: z.string().optional(),
        ctaText: z.string().optional(),
        ctaUrl: z.string().optional(),
        expiresAt: z.date().optional(),
        targetAudience: z.enum(['all', 'new_players', 'vip', 'inactive']).optional(),
      })
    )
    .mutation(({ input, ctx }) => {
      // Check if user is admin
      if (ctx.user.role !== 'admin') {
        throw new Error('Unauthorized');
      }

      const { id, ...updates } = input;
      return oneTimePopupService.updateAnnouncement(id, updates);
    }),

  /**
   * Delete announcement (admin only)
   */
  deleteAnnouncement: protectedProcedure
    .input(z.object({ id: z.string() }))
    .mutation(({ input, ctx }) => {
      // Check if user is admin
      if (ctx.user.role !== 'admin') {
        throw new Error('Unauthorized');
      }

      const success = oneTimePopupService.deleteAnnouncement(input.id);
      return { success };
    }),

  /**
   * Get statistics (admin only)
   */
  getStatistics: protectedProcedure.query(({ ctx }) => {
    // Check if user is admin
    if (ctx.user.role !== 'admin') {
      throw new Error('Unauthorized');
    }

    return oneTimePopupService.getStatistics();
  }),
});

export default oneTimePopupRouter;
