import { protectedProcedure, publicProcedure, router } from "../_core/trpc.ts";
import { z } from "zod";
import { cosmeticShopManager } from "../cosmetics.ts";

export const cosmeticsRouter = router({
  // Get shop catalog
  getShopCatalog: protectedProcedure.query(async ({ ctx }) => {
    const catalog = await cosmeticShopManager.getShopCatalog(ctx.user.id);
    return catalog;
  }),

  // Get cosmetics by type
  getByType: publicProcedure
    .input(z.object({ type: z.string() }))
    .query(({ input }) => {
      const cosmetics = cosmeticShopManager.getCosmeticsByType(
        input.type as any
      );
      return cosmetics;
    }),

  // Get cosmetics by rarity
  getByRarity: publicProcedure
    .input(z.object({ rarity: z.string() }))
    .query(({ input }) => {
      const cosmetics = cosmeticShopManager.getCosmeticsByRarity(
        input.rarity as any
      );
      return cosmetics;
    }),

  // Get limited time cosmetics
  getLimitedTime: publicProcedure.query(() => {
    const cosmetics = cosmeticShopManager.getLimitedTimeCosmetics();
    return cosmetics;
  }),

  // Purchase cosmetic
  purchase: protectedProcedure
    .input(z.object({ cosmeticId: z.number() }))
    .mutation(async ({ ctx, input }) => {
      const result = await cosmeticShopManager.purchaseCosmetic(
        ctx.user.id,
        input.cosmeticId
      );
      return result;
    }),

  // Activate cosmetic
  activate: protectedProcedure
    .input(z.object({ cosmeticId: z.number() }))
    .mutation(async ({ ctx, input }) => {
      const result = await cosmeticShopManager.activateCosmetic(
        ctx.user.id,
        input.cosmeticId
      );
      return result;
    }),

  // Get player's cosmetics
  getPlayerCosmetics: protectedProcedure.query(async ({ ctx }) => {
    const cosmetics = await cosmeticShopManager.getPlayerCosmetics(ctx.user.id);
    return cosmetics;
  }),

  // Get active cosmetics by type
  getActiveCosmetics: protectedProcedure.query(async ({ ctx }) => {
    const activeCosmetics = await cosmeticShopManager.getActiveCosmetics(
      ctx.user.id
    );
    return Array.from(activeCosmetics.entries()).map(([type, cosmetic]) => ({
      type,
      cosmetic,
    }));
  }),

  // Unlock cosmetic (for achievements)
  unlock: protectedProcedure
    .input(z.object({ cosmeticId: z.number() }))
    .mutation(async ({ ctx, input }) => {
      if (ctx.user.role !== "admin") {
        throw new Error("Only admins can unlock cosmetics");
      }
      await cosmeticShopManager.unlockCosmetic(ctx.user.id, input.cosmeticId);
      return { success: true };
    }),

  // Get cosmetic details
  getDetails: publicProcedure
    .input(z.object({ cosmeticId: z.number() }))
    .query(({ input }) => {
      const cosmetic = cosmeticShopManager.getCosmetic(input.cosmeticId);
      return cosmetic;
    }),

  // Search cosmetics
  search: publicProcedure
    .input(z.object({ query: z.string() }))
    .query(({ input }) => {
      // Simple search implementation
      const allCosmetics = [
        ...cosmeticShopManager.getCosmeticsByType("avatar_skin"),
        ...cosmeticShopManager.getCosmeticsByType("slot_theme"),
        ...cosmeticShopManager.getCosmeticsByType("animation"),
      ];

      return allCosmetics.filter((c) =>
        c.name.toLowerCase().includes(input.query.toLowerCase())
      );
    }),
});
