/**
 * StateManager - Gestion d'état centralisée pour l'interface TIM
 * 
 * Responsabilités:
 * - Stocker l'état global (séjour, code sélectionné, document actif, filtres)
 * - Notifier les composants des changements via EventEmitter
 * - Persister l'état dans localStorage
 * - Maintenir la synchronisation entre panneaux
 * 
 * Validates: Requirements 1.1, 7.7
 */
class StateManager extends EventEmitter {
  constructor() {
    super();
    this.state = this.loadState();
  }

  /**
   * État initial par défaut
   */
  getDefaultState() {
    return {
      currentStay: null,
      selectedCode: null,
      activeDocument: null,
      activeDocumentTab: null,
      clinicalFacts: [],
      filters: {
        codeType: [],
        confidenceLevel: [],
        withoutEvidence: false
      },
      searchTerm: '',
      comparisonMode: false,
      panelSizes: {
        codes: 25,
        documents: 45,
        details: 30
      }
    };
  }

  /**
   * Charger l'état depuis localStorage
   */
  loadState() {
    try {
      const saved = localStorage.getItem('tim_state');
      if (saved) {
        const parsed = JSON.parse(saved);
        // Fusionner avec l'état par défaut pour gérer les nouvelles propriétés
        return { ...this.getDefaultState(), ...parsed };
      }
    } catch (error) {
      console.error('Error loading state from localStorage:', error);
    }
    return this.getDefaultState();
  }

  /**
   * Sauvegarder l'état dans localStorage
   */
  saveState() {
    try {
      // Ne pas sauvegarder les données sensibles du séjour
      const stateToSave = {
        filters: this.state.filters,
        panelSizes: this.state.panelSizes,
        comparisonMode: this.state.comparisonMode
      };
      localStorage.setItem('tim_state', JSON.stringify(stateToSave));
    } catch (error) {
      console.error('Error saving state to localStorage:', error);
    }
  }

  // ===== GETTERS =====

  getCurrentStay() {
    return this.state.currentStay;
  }

  getSelectedCode() {
    return this.state.selectedCode;
  }

  getActiveDocument() {
    return this.state.activeDocument;
  }

  getActiveDocumentTab() {
    return this.state.activeDocumentTab;
  }

  getFilters() {
    return this.state.filters;
  }

  getSearchTerm() {
    return this.state.searchTerm;
  }

  getComparisonMode() {
    return this.state.comparisonMode;
  }

  getPanelSizes() {
    return this.state.panelSizes;
  }

  getClinicalFacts() {
    return this.state.clinicalFacts;
  }

  // ===== SETTERS (avec notification) =====

  setCurrentStay(stay) {
    this.state.currentStay = stay;
    this.emit('stayChanged', stay);
  }

  setClinicalFacts(facts) {
    this.state.clinicalFacts = facts;
    this.emit('clinicalFactsChanged', facts);
  }

  setSelectedCode(code) {
    this.state.selectedCode = code;
    this.emit('codeSelected', code);
  }

  setActiveDocument(document) {
    this.state.activeDocument = document;
    this.emit('documentChanged', document);
  }

  setActiveDocumentTab(tabId) {
    this.state.activeDocumentTab = tabId;
    this.emit('documentTabChanged', tabId);
  }

  setFilters(filters) {
    this.state.filters = { ...this.state.filters, ...filters };
    this.emit('filtersChanged', this.state.filters);
    this.saveState();
  }

  setSearchTerm(term) {
    this.state.searchTerm = term;
    this.emit('searchTermChanged', term);
  }

  setComparisonMode(enabled) {
    this.state.comparisonMode = enabled;
    this.emit('comparisonModeChanged', enabled);
    this.saveState();
  }

  setPanelSizes(sizes) {
    this.state.panelSizes = { ...this.state.panelSizes, ...sizes };
    this.emit('panelSizesChanged', this.state.panelSizes);
    this.saveState();
  }

  // ===== MÉTHODES UTILITAIRES =====

  /**
   * Réinitialiser l'état à ses valeurs par défaut
   */
  reset() {
    this.state = this.getDefaultState();
    this.emit('stateReset', this.state);
    this.saveState();
  }

  /**
   * Effacer toutes les données en cache (pour déconnexion)
   * Validates: Requirements 16.6
   */
  clearCache() {
    try {
      localStorage.removeItem('tim_state');
      localStorage.removeItem('tim_documents_cache');
      this.state = this.getDefaultState();
      this.emit('cacheCleared');
    } catch (error) {
      console.error('Error clearing cache:', error);
    }
  }

  /**
   * Cloner l'état actuel (pour rollback)
   */
  cloneState() {
    return JSON.parse(JSON.stringify(this.state));
  }

  /**
   * Restaurer un état précédent (rollback)
   */
  restoreState(previousState) {
    this.state = previousState;
    this.emit('stateRestored', this.state);
  }
}

// Export pour utilisation dans d'autres modules
if (typeof module !== 'undefined' && module.exports) {
  module.exports = StateManager;
}
