import React, { StrictMode } from 'react'
import { createRoot } from 'react-dom/client'
import './index.css'
import App from './App.jsx'

// Inicializa o objeto global window.commandCenter para gerenciamento de configurações de usuário
// Verifica se já não foi definido para evitar sobrescrever em ambientes de desenvolvimento com Fast Refresh
if (!window.commandCenter) {
  window.commandCenter = {
    _localStorageKey: 'commandCenterSettings', // Chave para o localStorage
    _settings: {}, // Armazenamento interno para as configurações (valor, defaultValue e callback)
    _listeners: [], // NEW: Array para armazenar funções de callback que reagem a mudanças

    /**
     * Carrega as configurações persistidas do localStorage.
     * @private
     * @returns {object} Um objeto com as configurações carregadas, ou um objeto vazio se não houver.
     */
    _loadPersistedSettings() {
      try {
        const storedSettings = localStorage.getItem(this._localStorageKey);
        return storedSettings ? JSON.parse(storedSettings) : {};
      } catch (e) {
        console.error("Erro ao carregar configurações do localStorage:", e);
        return {};
      }
    },

    /**
     * Salva as configurações atuais (apenas os valores) no localStorage.
     * @private
     */
    _savePersistedSettings() {
      const settingsToPersist = {};
      for (const key in this._settings) {
        settingsToPersist[key] = this._settings[key].value;
      }
      localStorage.setItem(this._localStorageKey, JSON.stringify(settingsToPersist));
    },

    /**
     * Notifica todos os listeners registrados sobre uma mudança nas configurações.
     * @private
     */
    _notifyListeners() {
      // Passa uma cópia das configurações para evitar modificações diretas
      this._listeners.forEach(listener => listener(this.getAllSettings()));
    },

    /**
     * Permite que um componente ou contexto se inscreva para receber notificações de mudanças nas configurações.
     * @param {function} listener - A função de callback a ser chamada quando as configurações mudarem.
     * @returns {function} Uma função para cancelar a inscrição (unsubscribe).
     */
    subscribe(listener) {
      this._listeners.push(listener);
      // Retorna uma função para remover o listener
      return () => {
        this._listeners = this._listeners.filter(l => l !== listener);
      };
    },

    /**
     * Registra uma nova configuração com um valor inicial.
     * @param {string} key - O nome da configuração.
     * @param {*} defaultValue - O valor inicial da configuração.
     * @param {function} [onChangeCallback] - Callback opcional para ser executado quando a configuração mudar.
     */
    registerSetting(key, defaultValue, onChangeCallback = null) {
      if (Object.prototype.hasOwnProperty.call(this._settings, key)) {
        console.warn(`A configuração '${key}' já está registrada. Sobrescrevendo.`);
      }
      // Tenta carregar o valor do localStorage, se existir, caso contrário usa o defaultValue
      const persistedSettings = this._loadPersistedSettings();
      const initialValue = Object.prototype.hasOwnProperty.call(persistedSettings, key) ? persistedSettings[key] : defaultValue;

      this._settings[key] = {
        value: initialValue, // Usa o valor persistido ou o padrão
        defaultValue: defaultValue, // NEW: Armazena o valor padrão original
        onChange: onChangeCallback,
      };
      console.log(`Configuração '${key}' registrada com valor:`, initialValue);
    },
    /**
     * Obtém o valor atual de uma configuração.
     * @param {string} key - O nome da configuração.
     * @returns {*} O valor da configuração, ou undefined se não for encontrada.
     */
    getSetting(key) {
      if (Object.prototype.hasOwnProperty.call(this._settings, key)) {
        return this._settings[key].value;
      }
      console.warn(`Configuração '${key}' não encontrada.`);
      return undefined;
    },

    /**
     * Define um novo valor para uma configuração existente.
     * @param {string} key - O nome da configuração.
     * @param {*} newValue - O novo valor para a configuração.
     */
    setSetting(key, newValue) {
      if (Object.prototype.hasOwnProperty.call(this._settings, key)) {
        const oldValue = this._settings[key].value;
        this._settings[key].value = newValue;
        console.log(`Configuração '${key}' alterada de '${oldValue}' para '${newValue}'.`);
        if (typeof this._settings[key].onChange === 'function') {
          this._settings[key].onChange(newValue, oldValue);
        }
        this._savePersistedSettings(); // Salva as configurações no localStorage após a alteração
        this._notifyListeners(); // NEW: Notifica todos os listeners após uma configuração ser alterada
      } else {
        console.warn(`Tentativa de definir a configuração não registrada '${key}'. Por favor, registre-a primeiro.`);
      }
    },

    /**
     * Obtém todas as configurações registradas.
     * @returns {object} Um objeto contendo todas as configurações registradas e seus valores atuais.
     */
    getAllSettings() {
      const all = {};
      for (const key in this._settings) {
        if (Object.prototype.hasOwnProperty.call(this._settings, key)) {
          all[key] = this._settings[key].value;
        }
      }
      return all;
    },

    /**
     * Reseta todas as configurações para seus valores padrão e limpa o localStorage.
     */
    resetSettings() {
      localStorage.removeItem(this._localStorageKey); // Remove a chave do localStorage
      console.log("Configurações do localStorage limpas.");
      for (const key in this._settings) {
        if (Object.prototype.hasOwnProperty.call(this._settings, key)) {
          // Define cada configuração para seu valor padrão original.
          this.setSetting(key, this._settings[key].defaultValue);
        }
      }
    }
  };

  // Exemplo: Registre algumas configurações de usuário iniciais
  window.commandCenter.registerSetting('theme', 'dark', (newValue) => {
    console.log('Tema alterado para:', newValue);
    document.body.className = newValue === 'dark' ? 'dark-theme' : 'light-theme';
  });
  window.commandCenter.registerSetting('notificationsEnabled', true);
  window.commandCenter.registerSetting('language', 'pt-BR');
  // Registering settings used in App.jsx's local state for consistency
  window.commandCenter.registerSetting('litros', 45);
  window.commandCenter.registerSetting('valor', 250.00);
  window.commandCenter.registerSetting('media', 10.2);
  window.commandCenter.registerSetting('km', 12450); // Registra km
  window.commandCenter.registerSetting('meta', 8); // Registra meta de jornada
  window.commandCenter.registerSetting('hud', true); // Registra sobreposição HUD
  window.commandCenter.registerSetting('screenReading', false); // NEW: Leitura de Tela
  window.commandCenter.registerSetting('secretCamera', false); // NEW: Câmera Secreta
  window.commandCenter.registerSetting('costPerKm', 0.50); // NEW: Custo por KM Rodado
  window.commandCenter.registerSetting('pickupDistance', 5); // NEW: Distância do Embarque
  window.commandCenter.registerSetting('autoAcceptTrips', false);

  // NEW: Salva as configurações iniciais (incluindo defaults ou valores carregados) no localStorage
  window.commandCenter._savePersistedSettings();
}

// 171
createRoot(document.getElementById('root')).render(
  <StrictMode>
    <App />
  </StrictMode>,
)
