/**
 * @fileoverview React component for EditorContext.jsx
 *
 * @module contexts.EditorContext
 */


import { createContext, useContext, useState, useCallback } from "react";
import PropTypes from "prop-types";

const EditorContext = createContext();

/**
 * Provider do contexto do editor que encapsula dados e handlers compartilhados
 * entre componentes do editor (Blockly / Code Editor).
 *
 * @component
 * @param {Object} props - Props do provider
 * @param {React.ReactNode} props.children - Componentes filhos que consomem o contexto
 * @param {Object} props.gameConfig - Configuração do jogo (gameId, fases, etc.)
 * @param {number} props.currentPhase - Fase atualmente selecionada (1-indexed)
 *
 * @returns {JSX.Element} Provider com estado e métodos de interação do editor
 */
export function EditorProvider({ children, gameConfig, currentPhase }) {
  const gameNameKey = `${gameConfig.gameId}-fase-${currentPhase}`;
  const [editorData, setEditorData] = useState({});

  const updateEditorData = useCallback((data) => {
    setEditorData((prevData) => ({ ...prevData, ...data }));
  }, []);

  return (
    <EditorContext.Provider
      value={{
        gameNameKey,
        gameConfig,
        currentPhase,
        editorData,
        updateEditorData,
      }}
    >
      {children}
    </EditorContext.Provider>
  );
}

EditorProvider.propTypes = {
  children: PropTypes.node,
  gameConfig: PropTypes.object,
  currentPhase: PropTypes.number,
};

/**
 * Hook para consumir o `EditorContext`.
 * Lance um erro se usado fora de um `EditorProvider`.
 *
 * @hook
 * @returns {Object} Context API do editor contendo: `gameNameKey`, `gameConfig`, `currentPhase`, `editorData`, `updateEditorData`
 *
 * @example
 * const { gameNameKey, editorData, updateEditorData } = useEditor();
 */
export function useEditor() {
  const ctx = useContext(EditorContext);
  if (!ctx) {
    throw new Error("useEditor deve ser usado dentro de EditorProvider");
  }
  return ctx;
}
