import { z } from "zod";
import { protectedProcedure, publicProcedure, router } from "../_core/trpc.ts";
// import * as pf from "../platformFeatures.ts"; // Disabled - missing database tables

export const platformRouter = router({
  // ─── GUILD MANAGEMENT ─────────────────────────────────────────────────────

  createGuild: protectedProcedure
    .input(z.object({ name: z.string().min(3).max(128), description: z.string().optional(), logoUrl: z.string().optional() }))
    .mutation(async ({ input, ctx }) => {
      return await pf.createGuild(ctx.user.id, input.name, input.description, input.logoUrl);
    }),

  getGuild: publicProcedure
    .input(z.object({ guildId: z.number() }))
    .query(async ({ input }) => {
      return await pf.getGuildById(input.guildId);
    }),

  getGuildMembers: publicProcedure
    .input(z.object({ guildId: z.number() }))
    .query(async ({ input }) => {
      return await pf.getGuildMembers(input.guildId);
    }),

  joinGuild: protectedProcedure
    .input(z.object({ guildId: z.number() }))
    .mutation(async ({ input, ctx }) => {
      return await pf.joinGuild(input.guildId, ctx.user.id);
    }),

  leaveGuild: protectedProcedure
    .input(z.object({ guildId: z.number() }))
    .mutation(async ({ input, ctx }) => {
      return await pf.leaveGuild(input.guildId, ctx.user.id);
    }),

  // ─── PLAYER STATISTICS ────────────────────────────────────────────────────

  getPlayerStats: publicProcedure
    .input(z.object({ userId: z.number() }))
    .query(async ({ input }) => {
      return await pf.getPlayerStats(input.userId);
    }),

  recordGameResult: protectedProcedure
    .input(
      z.object({
        gameType: z.enum(["poker", "bingo", "poolShark", "sportsbook"]),
        won: z.boolean(),
        betAmount: z.number(),
        winAmount: z.number().optional(),
      })
    )
    .mutation(async ({ input, ctx }) => {
      return await pf.recordGameResult(ctx.user.id, input.gameType, input.won, input.betAmount, input.winAmount || 0);
    }),

  // ─── VIP TIER MANAGEMENT ──────────────────────────────────────────────────

  getUserVipStatus: protectedProcedure.query(async ({ ctx }) => {
    return await pf.getUserVipStatus(ctx.user.id);
  }),

  checkVipUpgrade: protectedProcedure.mutation(async ({ ctx }) => {
    const status = await pf.getUserVipStatus(ctx.user.id);
    const lifetimeWinnings = parseFloat(status.lifetimeWinnings as any) || 0;
    return await pf.updateVipTier(ctx.user.id, lifetimeWinnings);
  }),

  // ─── REFERRAL SYSTEM ──────────────────────────────────────────────────────

  createReferral: protectedProcedure
    .input(z.object({ refereeId: z.number() }))
    .mutation(async ({ input, ctx }) => {
      return await pf.createReferralCode(ctx.user.id, input.refereeId);
    }),

  activateReferral: protectedProcedure
    .input(z.object({ referralId: z.number() }))
    .mutation(async ({ input }) => {
      return await pf.activateReferral(input.referralId);
    }),

  getReferrals: protectedProcedure.query(async ({ ctx }) => {
    return await pf.getReferralsByReferrer(ctx.user.id);
  }),

  // ─── TOURNAMENT MANAGEMENT ────────────────────────────────────────────────

  createTournament: protectedProcedure
    .input(
      z.object({
        name: z.string().min(3).max(255),
        gameType: z.string(),
        startAt: z.date(),
        endAt: z.date(),
        maxParticipants: z.number().min(2),
        entryFeeGc: z.number().min(0),
        prizePool: z.number().min(0),
        description: z.string().optional(),
      })
    )
    .mutation(async ({ input }) => {
      return await pf.createTournament(
        input.name,
        input.gameType,
        input.startAt,
        input.endAt,
        input.maxParticipants,
        input.entryFeeGc,
        input.prizePool,
        input.description
      );
    }),

  getTournament: publicProcedure
    .input(z.object({ tournamentId: z.number() }))
    .query(async ({ input }) => {
      return await pf.getTournamentById(input.tournamentId);
    }),

  joinTournament: protectedProcedure
    .input(z.object({ tournamentId: z.number() }))
    .mutation(async ({ input, ctx }) => {
      return await pf.joinTournament(input.tournamentId, ctx.user.id);
    }),

  getTournamentParticipants: publicProcedure
    .input(z.object({ tournamentId: z.number() }))
    .query(async ({ input }) => {
      return await pf.getTournamentParticipants(input.tournamentId);
    }),

  getActiveTournaments: publicProcedure.query(async () => {
    return await pf.getActiveTournaments();
  }),

  getUpcomingTournaments: publicProcedure
    .input(z.object({ limit: z.number().optional() }))
    .query(async ({ input }) => {
      return await pf.getUpcomingTournaments(input.limit);
    }),

  completeTournamentMatch: protectedProcedure
    .input(
      z.object({
        tournamentId: z.number(),
        userId: z.number(),
        finalRank: z.number(),
        prizeWon: z.number(),
      })
    )
    .mutation(async ({ input }) => {
      return await pf.completeTournamentMatch(input.tournamentId, input.userId, input.finalRank, input.prizeWon);
    }),
});
