import { ButtonInteraction, ModalSubmitInteraction, StringSelectMenuInteraction } from "discord.js";

// Union type for all component interactions
type ComponentInteraction = ButtonInteraction | StringSelectMenuInteraction | ModalSubmitInteraction;

// Type for the handler function that modules export
type InteractionHandler = (interaction: ComponentInteraction) => Promise<void>;

// Type for the dynamically imported module containing the handler
interface InteractionModule {
    [key: string]: (...args: any[]) => Promise<void> | any;
}

// Route definition
interface InteractionRoute {
    predicate: (interaction: ComponentInteraction) => boolean;
    handler: () => Promise<InteractionModule>;
    method: string;
}

export const interactionRoutes: InteractionRoute[] = [
    // --- TRADE MODULE ---
    {
        predicate: (i) => i.customId.startsWith("trade_") || i.customId === "amount",
        handler: () => import("@/modules/trade/trade.interaction"),
        method: 'handleTradeInteraction'
    },

    // --- ECONOMY MODULE ---
    {
        predicate: (i) => i.isButton() && i.customId.startsWith("shop_buy_"),
        handler: () => import("@/modules/economy/shop.interaction"),
        method: 'handleShopInteraction'
    },
    {
        predicate: (i) => i.isButton() && i.customId.startsWith("lootdrop_"),
        handler: () => import("@/modules/economy/lootdrop.interaction"),
        method: 'handleLootdropInteraction'
    },

    // --- ADMIN MODULE ---
    {
        predicate: (i) => i.customId.startsWith("createitem_"),
        handler: () => import("@/modules/admin/item_wizard"),
        method: 'handleItemWizardInteraction'
    },

    // --- USER MODULE ---
    {
        predicate: (i) => i.isButton() && i.customId === "enrollment",
        handler: () => import("@/modules/user/enrollment.interaction"),
        method: 'handleEnrollmentInteraction'
    },

    // --- FEEDBACK MODULE ---
    {
        predicate: (i) => i.customId.startsWith("feedback_"),
        handler: () => import("@/modules/feedback/feedback.interaction"),
        method: 'handleFeedbackInteraction'
    }
];
