'use client';

import { usePageMutation } from '@/lib/page/usePageData';
import { useInject } from '@/lib/di/hooks/useInject';
import { LEAGUE_WALLET_SERVICE_TOKEN } from '@/lib/di/tokens';
import { SubmitBlocker } from '@/lib/blockers/SubmitBlocker';
import { ThrottleBlocker } from '@/lib/blockers/ThrottleBlocker';
import type { LeagueWalletViewModel } from '@/lib/view-models/LeagueWalletViewModel';

/**
 * Hook for wallet withdrawals with client-side blockers
 * Handles UX prevention mechanisms (rate limiting, duplicate submission prevention)
 */
export function useLeagueWalletWithdrawalWithBlockers(leagueId: string, data: LeagueWalletViewModel | null, refetch: () => void) {
  const leagueWalletService = useInject(LEAGUE_WALLET_SERVICE_TOKEN);
  
  // Client-side blockers for UX improvement
  const submitBlocker = new SubmitBlocker();
  const throttle = new ThrottleBlocker(500);

  const withdrawMutation = usePageMutation(
    async ({ amount }: { amount: number }) => {
      if (!data) throw new globalThis.Error('Wallet data not available');
      
      // Client-side blockers (UX only, not security)
      if (!submitBlocker.canExecute() || !throttle.canExecute()) {
        throw new globalThis.Error('Request blocked due to rate limiting');
      }

      submitBlocker.block();
      throttle.block();
      
      try {
        const result = await leagueWalletService.withdraw(
          leagueId,
          amount,
          data.currency,
          'season-2', // Current active season
          'bank-account-***1234'
        );

        if (!result.success) {
          throw new globalThis.Error(result.message || 'Withdrawal failed');
        }

        return result;
      } finally {
        submitBlocker.release();
      }
    },
    {
      onSuccess: () => {
        // Refetch wallet data after successful withdrawal
        refetch();
      },
    }
  );

  return withdrawMutation;
}