import {
    handleAddXp,
    handleAddBalance,
    handleReplyMessage,
    handleXpBoost,
    handleTempRole,
    handleColorRole,
    handleLootbox
} from "./effect.handlers";
import type { EffectHandler, ValidatedEffectPayload } from "./effect.types";
import { EffectPayloadSchema } from "./effect.types";
import { UserError } from "@shared/lib/errors";
import type { Transaction } from "@shared/lib/types";

export const effectHandlers: Record<string, EffectHandler> = {
    'ADD_XP': handleAddXp,
    'ADD_BALANCE': handleAddBalance,
    'REPLY_MESSAGE': handleReplyMessage,
    'XP_BOOST': handleXpBoost,
    'TEMP_ROLE': handleTempRole,
    'COLOR_ROLE': handleColorRole,
    'LOOTBOX': handleLootbox
};

export async function validateAndExecuteEffect(
    effect: unknown,
    userId: string,
    tx: Transaction
) {
    const result = EffectPayloadSchema.safeParse(effect);
    if (!result.success) {
        throw new UserError(`Invalid effect configuration: ${result.error.message}`);
    }

    const handler = effectHandlers[result.data.type];
    if (!handler) {
        throw new UserError(`Unknown effect type: ${result.data.type}`);
    }

    return handler(userId, result.data, tx);
}
