/**
 * Event bus para comunicação entre React (GameStateContext) e Phaser (scenes).
 * Usa CustomEvent para desacoplar componentes React de lógica de jogo Phaser.
 *
 * Fluxo de eventos:
 * - React → Phaser: executeCode, resetGame, pauseGame, stopExecution
 * - Phaser → React: gameSuccess, gameFailure, gameReady
 *
 * @module utils/gameEvents
 * @class GameEventBus
 * @extends {EventTarget}
 */
class GameEventBus extends EventTarget {
  /**
   * React envia código/workspace para Phaser executar.
   *
   * @function executeCode
   * @param {string|Object} code - Código JS ou workspace Blockly
   * @param {Object} workspace - Workspace do Blockly (se código for Blockly)
   * @returns {void}
   * @fires executeCode - CustomEvent com detail: { code, workspace }
   */
  executeCode(code, workspace) {
    this.dispatchEvent(
      new CustomEvent("executeCode", {
        detail: {
          code: code,
          workspace: workspace,
        },
      }),
    );
  }

  /**
   * React solicita reset/restart do jogo ao Phaser.
   * Restaura jogo ao estado inicial.
   *
   * @function resetGame
   * @returns {void}
   * @fires resetGame - CustomEvent simples
   */
  resetGame() {
    this.dispatchEvent(new CustomEvent("resetGame"));
  }

  /**
   * React solicita pausa do jogo ao Phaser.
   * Interrompe lógica de jogo mas mantém renderização.
   *
   * @function pauseGame
   * @returns {void}
   * @fires pauseGame - CustomEvent simples
   */
  pauseGame() {
    this.dispatchEvent(new CustomEvent("pauseGame"));
  }

  /**
   * Phaser notifica React de sucesso na execução.
   * Dispara modal de sucesso e marca fase como completada.
   *
   * @function gameSuccess
   * @returns {void}
   * @fires gameSuccess - CustomEvent simples
   */
  gameSuccess() {
    this.dispatchEvent(new CustomEvent("gameSuccess"));
  }

  /**
   * Phaser notifica React de falha na execução.
   * Dispara modal de erro com mensagem de feedback.
   *
   * @function gameFailure
   * @param {string} [reason] - Mensagem/razão da falha
   * @returns {void}
   * @fires gameFailure - CustomEvent com detail: { reason }
   */
  gameFailure(reason) {
    this.dispatchEvent(new CustomEvent("gameFailure", { detail: { reason } }));
  }

  /**
   * Phaser notifica que cena está pronta para executar código.
   * Indica que objetos do jogo foram inicializados.
   *
   * @function gameReady
   * @returns {void}
   * @fires gameReady - CustomEvent simples
   */
  gameReady() {
    this.dispatchEvent(new CustomEvent("gameReady"));
  }

  /**
   * React solicita parada da execução ao Phaser.
   * Para interpretador e limpa estado de execução.
   *
   * @function stopExecution
   * @returns {void}
   * @fires stopExecution - CustomEvent simples
   */
  stopExecution() {
    this.dispatchEvent(new CustomEvent("stopExecution"));
  }
}

/**
 * Instância singleton do event bus.
 * Use para: gameEventBus.executeCode(...), gameEventBus.gameSuccess(), etc.
 *
 * @type {GameEventBus}
 */
export const gameEventBus = new GameEventBus();
