/**
 * Менеджер прокси настроек для RPC провайдеров
 * Copyright (c) 2024-2026 Тарабанов Александр Викторович
 */

const rpcProviderService = require('../services/rpcProviderService');

class ProxyManager {
  constructor() {
    this.initialized = false;
  }

  /**
   * Инициализация менеджера прокси
   */
  async initialize() {
    if (this.initialized) return;
    
    try {
      await this.configureNoProxyFromRpcProviders();
      this.initialized = true;
      console.log('[ProxyManager] ✅ Инициализация завершена');
    } catch (error) {
      console.error('[ProxyManager] ❌ Ошибка инициализации:', error.message);
      throw error;
    }
  }

  /**
   * Настройка NO_PROXY на основе RPC провайдеров из базы данных
   */
  async configureNoProxyFromRpcProviders() {
    try {
      const providers = await rpcProviderService.getAllRpcProviders();
      
      const rpcDomains = providers
        .map(provider => provider.rpc_url)
        .filter(url => url && url.startsWith('http'))
        .map(url => {
          try {
            const urlObj = new URL(url);
            return urlObj.hostname;
          } catch (e) {
            console.warn(`[ProxyManager] Неверный URL: ${url}`, e.message);
            return null;
          }
        })
        .filter(hostname => hostname)
        .filter((hostname, index, array) => array.indexOf(hostname) === index); // убираем дубликаты
      
      if (rpcDomains.length > 0) {
        const existingNoProxy = process.env.NO_PROXY || '';
        
        // Добавляем RPC домены к существующему NO_PROXY
        const newDomains = rpcDomains.filter(domain => !existingNoProxy.includes(domain));
        
        if (newDomains.length > 0) {
          process.env.NO_PROXY = existingNoProxy ? `${existingNoProxy},${newDomains.join(',')}` : newDomains.join(',');
          console.log('[ProxyManager] ✅ Добавлены RPC домены в NO_PROXY:', newDomains.join(', '));
          console.log('[ProxyManager] 📋 Обновленный NO_PROXY:', process.env.NO_PROXY);
        } else {
          console.log('[ProxyManager] ℹ️ Все RPC домены уже в NO_PROXY');
        }
      } else {
        console.warn('[ProxyManager] ⚠️ Не найдено RPC провайдеров для настройки NO_PROXY');
      }
    } catch (error) {
      console.error('[ProxyManager] ❌ Не удалось загрузить RPC провайдеры для NO_PROXY:', error.message);
      throw error;
    }
  }

  /**
   * Проверить текущие настройки прокси
   */
  getProxyStatus() {
    return {
      httpProxy: process.env.HTTP_PROXY || null,
      httpsProxy: process.env.HTTPS_PROXY || null,
      noProxy: process.env.NO_PROXY || null,
      initialized: this.initialized
    };
  }

  /**
   * Принудительно обновить настройки NO_PROXY
   */
  async refresh() {
    this.initialized = false;
    await this.initialize();
  }
}

// Создаем singleton
const proxyManager = new ProxyManager();

module.exports = {
  ProxyManager,
  proxyManager,
  // Экспортируем методы для удобства
  initialize: () => proxyManager.initialize(),
  configureNoProxyFromRpcProviders: () => proxyManager.configureNoProxyFromRpcProviders(),
  getProxyStatus: () => proxyManager.getProxyStatus(),
  refresh: () => proxyManager.refresh()
};
