import { requireAuth } from '@/server/utils/auth';
import { 
  convertToUSD, 
  getCurrencySymbol, 
  formatPriceWithCurrency, 
  createDisplayPrice,
  getExchangeRates,
  processExpenseWithCurrency
} from '@/server/utils/currency';

export default defineEventHandler(async (event) => {
  await requireAuth(event);
  
  console.log('[currency/test] Running currency conversion tests...');
  
  try {
    const testResults = {
      timestamp: new Date().toISOString(),
      tests: [] as any[]
    };
    
    // Test 1: Get exchange rates
    console.log('[currency/test] Test 1: Getting exchange rates...');
    const rates = await getExchangeRates();
    testResults.tests.push({
      name: 'Get Exchange Rates',
      success: !!rates,
      data: rates ? {
        cached: true,
        ratesCount: Object.keys(rates.rates).length,
        lastUpdated: rates.lastUpdated,
        sampleRates: {
          EUR: rates.rates.EUR,
          GBP: rates.rates.GBP,
          JPY: rates.rates.JPY
        }
      } : null
    });
    
    // Test 2: Currency symbol mapping
    console.log('[currency/test] Test 2: Testing currency symbols...');
    const symbolTests = ['EUR', 'USD', 'GBP', 'JPY', 'CHF'];
    const symbols = symbolTests.map(code => ({
      code,
      symbol: getCurrencySymbol(code)
    }));
    testResults.tests.push({
      name: 'Currency Symbols',
      success: true,
      data: symbols
    });
    
    // Test 3: Currency conversion
    console.log('[currency/test] Test 3: Testing currency conversion...');
    const conversionTests = [
      { amount: 100, from: 'EUR' },
      { amount: 50, from: 'GBP' },
      { amount: 1000, from: 'JPY' },
      { amount: 100, from: 'USD' } // Should be 1:1 conversion
    ];
    
    const conversions = [];
    for (const test of conversionTests) {
      try {
        const result = await convertToUSD(test.amount, test.from);
        conversions.push({
          original: `${test.amount} ${test.from}`,
          result: result ? {
            usdAmount: result.usdAmount,
            rate: result.rate,
            formatted: formatPriceWithCurrency(result.usdAmount, 'USD')
          } : null,
          success: !!result
        });
      } catch (error) {
        conversions.push({
          original: `${test.amount} ${test.from}`,
          result: null,
          success: false,
          error: error instanceof Error ? error.message : 'Unknown error'
        });
      }
    }
    testResults.tests.push({
      name: 'Currency Conversions',
      success: conversions.every(c => c.success),
      data: conversions
    });
    
    // Test 4: Display price formatting
    console.log('[currency/test] Test 4: Testing display price formatting...');
    const displayTests = [
      { amount: 45.99, currency: 'EUR', usd: 48.12 },
      { amount: 100, currency: 'USD' }, // No USD conversion needed
      { amount: 85.50, currency: 'GBP', usd: 103.25 }
    ];
    
    const displayPrices = displayTests.map(test => ({
      original: { amount: test.amount, currency: test.currency },
      display: createDisplayPrice(test.amount, test.currency, test.usd),
      formatted: formatPriceWithCurrency(test.amount, test.currency)
    }));
    testResults.tests.push({
      name: 'Display Price Formatting',
      success: true,
      data: displayPrices
    });
    
    // Test 5: Full expense processing
    console.log('[currency/test] Test 5: Testing full expense processing...');
    const mockExpense = {
      Id: 999,
      'Establishment Name': 'Test Restaurant',
      Price: '45.99',
      currency: 'EUR',
      'Payment Method': 'Card',
      Category: 'Food/Drinks',
      Payer: 'Test User',
      Time: new Date().toISOString(),
      Contents: 'Test expense for currency conversion',
      Receipt: [],
      Paid: false,
      CreatedAt: new Date().toISOString(),
      UpdatedAt: new Date().toISOString()
    };
    
    const processedExpense = await processExpenseWithCurrency(mockExpense);
    testResults.tests.push({
      name: 'Full Expense Processing',
      success: !!(processedExpense.PriceUSD && processedExpense.DisplayPrice),
      data: {
        original: mockExpense,
        processed: {
          PriceNumber: processedExpense.PriceNumber,
          CurrencySymbol: processedExpense.CurrencySymbol,
          PriceUSD: processedExpense.PriceUSD,
          ConversionRate: processedExpense.ConversionRate,
          DisplayPrice: processedExpense.DisplayPrice,
          DisplayPriceUSD: processedExpense.DisplayPriceUSD
        }
      }
    });
    
    // Calculate overall success
    const overallSuccess = testResults.tests.every(test => test.success);
    
    console.log(`[currency/test] Tests completed. Overall success: ${overallSuccess}`);
    
    return {
      success: overallSuccess,
      message: overallSuccess ? 'All currency tests passed' : 'Some currency tests failed',
      results: testResults
    };
    
  } catch (error: any) {
    console.error('[currency/test] Error during currency tests:', error);
    
    throw createError({
      statusCode: 500,
      statusMessage: error.message || 'Currency test failed'
    });
  }
});
