/**
 * Page Manager - автоматический роутинг и управление page controllers
 */
export class PageManager {
  constructor() {
    this.controllers = new Map();
    this.currentController = null;
    this.currentPage = null;
    
    this.init();
  }

  init() {
    this.detectCurrentPage();
    this.loadPageController();
  }

  /**
   * Определяет текущую страницу по URL или data-page атрибуту
   */
  detectCurrentPage() {
    // Сначала проверяем data-page атрибут на body
    const bodyPageAttr = document.body.dataset.page;
    if (bodyPageAttr) {
      this.currentPage = bodyPageAttr;
      return;
    }

    // Затем определяем по pathname
    const pathname = window.location.pathname;
    let filename = pathname.split('/').pop();
    
    // Обработка различных случаев пути
    if (!filename || filename === '' || filename === '/') {
      // Если путь пустой или корневой, это главная страница
      this.currentPage = 'index';
    } else if (filename.includes('.html')) {
      // Если есть расширение .html, удаляем его
      this.currentPage = filename.replace(/\.html?$/, '');
    } else {
      // Если нет расширения, используем как есть
      this.currentPage = filename;
    }
    
    // Fallback на index если что-то пошло не так
    if (!this.currentPage || this.currentPage === '') {
      this.currentPage = 'index';
    }
    
    console.log(`🌐 PageManager: Detected page "${this.currentPage}"`);
  }

  /**
   * Динамически загружает controller для текущей страницы
   */
  async loadPageController() {
    if (!this.currentPage) {
      console.warn('🌐 PageManager: No page detected');
      return;
    }

    try {
      // Пытаемся загрузить page controller
      const controllerModule = await import(`../pages/${this.currentPage}.js`);
      const ControllerClass = controllerModule.default || controllerModule[`${this.capitalize(this.currentPage)}Page`];
      
      if (ControllerClass) {
        console.log(`🌐 PageManager: Loading controller for "${this.currentPage}"`);
        
        // Создаем экземпляр controller
        this.currentController = new ControllerClass();
        this.controllers.set(this.currentPage, this.currentController);
        
        // Инициализируем controller
        if (typeof this.currentController.init === 'function') {
          await this.currentController.init();
        }
        
        console.log(`✅ PageManager: Controller for "${this.currentPage}" loaded successfully`);
      } else {
        console.log(`🌐 PageManager: No controller class found for "${this.currentPage}"`);
      }
    } catch (error) {
      // Это нормально - не все страницы должны иметь controller
      if (error.message.includes('Failed to resolve module') || 
          error.message.includes('Unknown variable dynamic import') ||
          error.message.includes('Cannot resolve')) {
        console.log(`🌐 PageManager: No controller found for "${this.currentPage}" (this is OK)`);
      } else {
        console.error(`❌ PageManager: Error loading controller for "${this.currentPage}":`, error);
      }
    }
  }

  /**
   * Получить текущий активный controller
   */
  getCurrentController() {
    return this.currentController;
  }

  /**
   * Получить controller по имени страницы
   */
  getController(pageName) {
    return this.controllers.get(pageName);
  }

  /**
   * Очистка ресурсов при навигации
   */
  cleanup() {
    if (this.currentController && typeof this.currentController.destroy === 'function') {
      this.currentController.destroy();
    }
  }

  /**
   * Утилитарный метод для капитализации строк
   */
  capitalize(str) {
    return str.charAt(0).toUpperCase() + str.slice(1);
  }

  /**
   * Регистрация кастомного controller
   */
  registerController(pageName, controllerInstance) {
    this.controllers.set(pageName, controllerInstance);
    console.log(`🌐 PageManager: Registered custom controller for "${pageName}"`);
  }

  /**
   * Получение информации о состоянии
   */
  getInfo() {
    return {
      currentPage: this.currentPage,
      hasController: !!this.currentController,
      controllersCount: this.controllers.size,
      controllers: Array.from(this.controllers.keys())
    };
  }
}