// 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 AppConfig {
  nostr: NostrConfig
  api: ApiConfig
  push: PushConfig
  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_API_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)
  },
  support: {
    npub: import.meta.env.VITE_SUPPORT_NPUB || ''
  }
} as const

// 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)
  },
  
  getDefaultRelays: (): string[] => {
    return config.nostr.relays
  }
}

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