#!/usr/bin/env bun

/**
 * Configuration System Test
 * Verifies that TypedFetch works with zero-config and custom configurations
 */

import { tf, createTypedFetch } from '../src/index.js'

console.log('🧪 Testing TypedFetch Configuration System\n')

// Test 1: Zero-config (should work out of the box)
console.log('1️⃣ Zero-Config Test')
try {
  const response = await tf.get('https://api.github.com/users/github')
  console.log('✅ Zero-config works! Got user:', response.data.name)
} catch (error) {
  console.error('❌ Zero-config failed:', error)
}

// Test 2: Global configuration
console.log('\n2️⃣ Global Configuration Test')
tf.configure({
  cache: { maxSize: 1000, ttl: 60000 }, // 1 minute cache
  retry: { maxAttempts: 5 },
  debug: { verbose: true }
})
console.log('✅ Global configuration applied')

// Test 3: Per-instance configuration
console.log('\n3️⃣ Per-Instance Configuration Test')
const customClient = tf.create({
  retry: { maxAttempts: 1 }, // No retries
  cache: { enabled: false }, // No caching
  request: {
    timeout: 5000, // 5 second timeout
    headers: { 'X-Custom-Header': 'test' }
  }
})
console.log('✅ Custom instance created with specific config')

// Test 4: Verify configurations are independent
console.log('\n4️⃣ Configuration Independence Test')
const metrics1 = tf.getMetrics()
const metrics2 = customClient.getMetrics()
console.log('✅ Main instance metrics:', metrics1)
console.log('✅ Custom instance metrics:', metrics2)

// Test 5: Test error handling with context
console.log('\n5️⃣ Enhanced Error Context Test')
try {
  await tf.get('https://httpstat.us/404')
} catch (error: any) {
  console.log('✅ Error with context:', error.message)
  console.log('  - URL:', error.url)
  console.log('  - Method:', error.method)
  console.log('  - Status:', error.status)
  console.log('  - Suggestions:', error.suggestions)
}

// Test 6: Test configuration validation
console.log('\n6️⃣ Configuration Options Test')
const testClient = createTypedFetch({
  cache: { maxSize: 10, ttl: 1000 },
  retry: { 
    maxAttempts: 2,
    delays: [50, 100],
    retryableStatuses: [500, 503]
  },
  circuit: {
    threshold: 3,
    timeout: 10000,
    enabled: true
  },
  request: {
    timeout: 15000,
    baseURL: 'https://api.github.com'
  },
  metrics: { enabled: true },
  debug: { verbose: false, logErrors: true }
})

// Test with base URL
const user = await testClient.get('/users/torvalds')
console.log('✅ Base URL works! Got user:', user.data.name)

// Test metrics
const finalMetrics = testClient.getMetrics()
console.log('✅ Metrics collected:', finalMetrics)

console.log('\n✨ All configuration tests passed!')