import { protectedProcedure, publicProcedure, router } from "../_core/trpc.ts";
import { z } from "zod";
import { referralManager, getReferralTier, REFERRAL_TIERS } from "../referrals.ts";

export const referralRouter = router({
  // Generate referral link
  generateLink: protectedProcedure.mutation(({ ctx }) => {
    const code = referralManager.generateReferralCode(ctx.user.id);
    const link = referralManager.createReferralLink(ctx.user.id);
    return { code, link };
  }),

  // Get referral code
  getCode: protectedProcedure.query(({ ctx }) => {
    const code = referralManager.getReferralCode(ctx.user.id);
    return { code };
  }),

  // Register referral (when new user signs up with code)
  register: publicProcedure
    .input(z.object({ referralCode: z.string() }))
    .mutation(async ({ input }) => {
      // This would be called during user signup
      // For now, just validate the code
      const referrerId = referralManager.getReferrerId(input.referralCode);
      if (!referrerId) {
        return { success: false, message: 'Invalid referral code' };
      }
      return { success: true, referrerId };
    }),

  // Complete referral (when referred user makes first wager)
  complete: protectedProcedure
    .input(z.object({ referralCode: z.string(), firstWagerAmount: z.number() }))
    .mutation(async ({ input }) => {
      const result = await referralManager.completeReferral(
        input.referralCode,
        input.firstWagerAmount
      );
      return result;
    }),

  // Get referral stats
  getStats: protectedProcedure.query(async ({ ctx }) => {
    const stats = await referralManager.getReferralStats(ctx.user.id);
    const tier = getReferralTier(stats.completedReferrals);
    const tierInfo = REFERRAL_TIERS[tier as keyof typeof REFERRAL_TIERS];

    return {
      ...stats,
      tier,
      tierInfo,
    };
  }),

  // Get referral history
  getHistory: protectedProcedure
    .input(z.object({ limit: z.number().default(50) }))
    .query(async ({ ctx, input }) => {
      const history = await referralManager.getReferralHistory(ctx.user.id, input.limit);
      return history;
    }),

  // Get pending referrals
  getPending: protectedProcedure.query(async ({ ctx }) => {
    const pending = await referralManager.getPendingReferrals(ctx.user.id);
    return pending;
  }),

  // Get completed referrals
  getCompleted: protectedProcedure.query(async ({ ctx }) => {
    const completed = await referralManager.getCompletedReferrals(ctx.user.id);
    return completed;
  }),

  // Get top referrers
  getTopReferrers: publicProcedure
    .input(z.object({ limit: z.number().default(10) }))
    .query(async ({ input }) => {
      const topReferrers = await referralManager.getTopReferrers(input.limit);
      return topReferrers;
    }),

  // Get referral tiers
  getTiers: publicProcedure.query(() => {
    return Object.entries(REFERRAL_TIERS).map(([tier, config]) => ({
      tier,
      ...config,
    }));
  }),

  // Get referral tier for player
  getTier: protectedProcedure.query(async ({ ctx }) => {
    const stats = await referralManager.getReferralStats(ctx.user.id);
    const tier = getReferralTier(stats.completedReferrals);
    const tierInfo = REFERRAL_TIERS[tier as keyof typeof REFERRAL_TIERS];

    return {
      tier,
      ...tierInfo,
      completedReferrals: stats.completedReferrals,
      nextTierAt: tier !== 'diamond' ? REFERRAL_TIERS[Object.keys(REFERRAL_TIERS)[Object.keys(REFERRAL_TIERS).indexOf(tier) + 1] as keyof typeof REFERRAL_TIERS]?.minReferrals : null,
    };
  }),

  // Get referral leaderboard
  getLeaderboard: publicProcedure
    .input(z.object({ limit: z.number().default(20) }))
    .query(async ({ input }) => {
      const topReferrers = await referralManager.getTopReferrers(input.limit);
      return topReferrers.map((referrer, index) => ({
        rank: index + 1,
        ...referrer,
        tier: getReferralTier(referrer.completedReferrals),
      }));
    }),

  // Get referral stats for all players (admin only)
  getAllStats: protectedProcedure.query(async ({ ctx }) => {
    if (ctx.user.role !== 'admin') {
      throw new Error('Only admins can view all referral stats');
    }

    // Return aggregate statistics
    return {
      totalReferrals: 0,
      totalCompletedReferrals: 0,
      totalCommissionPaid: 0,
      averageCommissionPerReferral: 0,
      topReferrer: null,
    };
  }),
});
