// Centralized configuration management
// Handles all environment variables and app configuration

interface NostrConfig {
  relays: string[]
  adminPubkeys: string[]
}

interface ApiConfig {
  baseUrl: string
  key: string
}

interface PushConfig {
  vapidPublicKey: string
  enabled: boolean
}

interface MarketConfig {
  defaultNaddr: string
  lightningEnabled: boolean
  defaultCurrency: string
}

interface AppConfig {
  nostr: NostrConfig
  api: ApiConfig
  push: PushConfig
  market: MarketConfig
  nostrclient: {
    url: string
    enabled: boolean
  }
  support: {
    npub: string
  }
}

// Parse JSON environment variables safely
function parseJsonEnv(envVar: string | undefined, fallback: any = []): any {
  if (!envVar) return fallback
  
  try {
    return JSON.parse(envVar)
  } catch (error) {
    console.warn(`Failed to parse environment variable: ${envVar}`)
    return fallback
  }
}

// Create the configuration object
export const config: AppConfig = {
  nostr: {
    relays: parseJsonEnv(import.meta.env.VITE_NOSTR_RELAYS, []),
    adminPubkeys: parseJsonEnv(import.meta.env.VITE_ADMIN_PUBKEYS, [])
  },
  api: {
    baseUrl: import.meta.env.VITE_LNBITS_BASE_URL || '',
    key: import.meta.env.VITE_API_KEY || ''
  },
  push: {
    vapidPublicKey: import.meta.env.VITE_VAPID_PUBLIC_KEY || '',
    enabled: Boolean(import.meta.env.VITE_PUSH_NOTIFICATIONS_ENABLED)
  },
  market: {
    defaultNaddr: import.meta.env.VITE_MARKET_NADDR || '',
    lightningEnabled: Boolean(import.meta.env.VITE_LIGHTNING_ENABLED),
    defaultCurrency: import.meta.env.VITE_MARKET_DEFAULT_CURRENCY || 'sat'
  },
  nostrclient: {
    url: import.meta.env.VITE_NOSTRCLIENT_URL || 'wss://localhost:5000/nostrclient/api/v1',
    enabled: Boolean(import.meta.env.VITE_NOSTRCLIENT_ENABLED)
  },
  support: {
    npub: import.meta.env.VITE_SUPPORT_NPUB || ''
  }
} as const

// Debug logging
console.log('🔧 Config loaded:', {
  VITE_LNBITS_BASE_URL: import.meta.env.VITE_LNBITS_BASE_URL,
  apiBaseUrl: config.api.baseUrl,
  apiKey: config.api.key ? '***' : 'not set'
})

// Utility functions for common config operations
export const configUtils = {
  isAdminPubkey: (pubkey: string): boolean => {
    return config.nostr.adminPubkeys.includes(pubkey)
  },
  
  hasNostrConfig: (): boolean => {
    return config.nostr.relays.length > 0
  },
  
  hasApiConfig: (): boolean => {
    return Boolean(config.api.baseUrl && config.api.key)
  },
  
  hasPushConfig: (): boolean => {
    return Boolean(config.push.vapidPublicKey && config.push.enabled)
  },
  
  hasMarketConfig: (): boolean => {
    return Boolean(config.market.defaultNaddr)
  },
  
  getDefaultRelays: (): string[] => {
    return config.nostr.relays
  },
  
  getMarketRelays: (): string[] => {
    // Market now uses the same relays as the main Nostr configuration
    return config.nostr.relays
  }
}

// Export individual config sections for convenience
export const { nostr: nostrConfig, api: apiConfig, market: marketConfig } = config