/**
 * Copyright (c) 2024-2026 Тарабанов Александр Викторович
 * All rights reserved.
 * 
 * This software is proprietary and confidential.
 * Unauthorized copying, modification, or distribution is prohibited.
 * 
 * For licensing inquiries: info@hb3-accelerator.com
 * Website: https://hb3-accelerator.com
 * GitHub: https://github.com/VC-HB3-Accelerator
 */

const logger = require('./logger');

class MemoryMonitor {
  constructor() {
    this.monitoring = false;
    this.interval = null;
    this.lastMemoryUsage = null;
  }

  start(intervalMs = 60000) { // По умолчанию каждую минуту
    if (this.monitoring) {
      logger.warn('[MemoryMonitor] Мониторинг уже запущен');
      return;
    }

    this.monitoring = true;
    this.interval = setInterval(() => {
      this.checkMemoryUsage();
    }, intervalMs);

    logger.info('[MemoryMonitor] Мониторинг памяти запущен');
  }

  stop() {
    if (this.interval) {
      clearInterval(this.interval);
      this.interval = null;
    }
    this.monitoring = false;
    logger.info('[MemoryMonitor] Мониторинг памяти остановлен');
  }

  checkMemoryUsage() {
    const memUsage = process.memoryUsage();
    const memUsageMB = {
      rss: Math.round(memUsage.rss / 1024 / 1024),
      heapTotal: Math.round(memUsage.heapTotal / 1024 / 1024),
      heapUsed: Math.round(memUsage.heapUsed / 1024 / 1024),
      external: Math.round(memUsage.external / 1024 / 1024),
      arrayBuffers: Math.round(memUsage.arrayBuffers / 1024 / 1024)
    };

    // Проверяем рост памяти
    if (this.lastMemoryUsage) {
      const growth = {
        rss: memUsageMB.rss - this.lastMemoryUsage.rss,
        heapUsed: memUsageMB.heapUsed - this.lastMemoryUsage.heapUsed
      };

      // Логируем если есть значительный рост
      if (growth.rss > 50 || growth.heapUsed > 20) {
        logger.warn('[MemoryMonitor] Обнаружен рост памяти:', {
          current: memUsageMB,
          growth: growth
        });
      }
    }

    this.lastMemoryUsage = memUsageMB;

    // Логируем только при значительном росте памяти
    // logger.info('[MemoryMonitor] Использование памяти:', memUsageMB); // Убрано избыточное логирование
  }

  getMemoryUsage() {
    const memUsage = process.memoryUsage();
    return {
      rss: Math.round(memUsage.rss / 1024 / 1024),
      heapTotal: Math.round(memUsage.heapTotal / 1024 / 1024),
      heapUsed: Math.round(memUsage.heapUsed / 1024 / 1024),
      external: Math.round(memUsage.external / 1024 / 1024),
      arrayBuffers: Math.round(memUsage.arrayBuffers / 1024 / 1024)
    };
  }

  // Проверка утечек в EventEmitter
  checkEventEmitterLeaks() {
    const eventEmitter = require('events');
    const defaultMaxListeners = eventEmitter.defaultMaxListeners;
    
    // logger.info('[MemoryMonitor] EventEmitter defaultMaxListeners:', defaultMaxListeners); // Убрано избыточное логирование
    
    // Можно добавить дополнительную логику для проверки конкретных EventEmitter'ов
  }
}

module.exports = new MemoryMonitor();
