/**
 * @fileoverview Utility module for interpreterSetup.js
 * * @module games.quebracabecas.hooks.interpreterSetup
 */

import { ApiHelpers } from "../../../../interpreters/ApiHelpers.js";

/**
 * Configura a API disponível ao interpretador para o jogo Quebra Cabeças.
 * Registra funções que chamam métodos da `scene` com wrappers do `ApiHelpers`.
 * @param {Object} scene - Instância da cena Phaser (ex.: `QuebraCabecasScene`)
 * @param {Object} [config] - Opções (ex.: `animationSpeed`)
 * @returns {Function} Função que realiza o registro no `interpreter` e `globalScope`
 */
export const setupQuebraCabecasAPI = (scene, config = {}) => {
  return (interpreter, globalScope) => {

    // 1. definirTipoAnimal(tipo) – registra o tipo do animal
    const definirTipoAnimalWrapper = function(tipo, done) {
      const tipoValor = tipo && tipo.data !== undefined ? tipo.data : String(tipo ?? "");
      const result = scene.definirTipoAnimal(tipoValor);
      if (result && typeof result.then === "function") {
        result.then(() => done()).catch(() => done());
      } else {
        done();
      }
    };

    interpreter.setProperty(
      globalScope,
      "definirTipoAnimal",
      interpreter.createAsyncFunction(definirTipoAnimalWrapper)
    );

    // 2. definirCaracteristica(chave, valor) – wrapper async com dois argumentos reais.
    const definirCaracteristicaWrapper = function(chave, valor, done) {
      const chaveReal = chave && chave.data !== undefined ? chave.data : String(chave ?? "");
      const valorReal = valor && valor.data !== undefined ? valor.data : (valor instanceof Object ? String(valor) : valor);
      
      const result = scene.definirCaracteristica(chaveReal, valorReal);
      if (result && typeof result.then === "function") {
        result.then(() => done()).catch(() => done());
      } else {
        done();
      }
    };

    interpreter.setProperty(
      globalScope,
      "definirCaracteristica",
      interpreter.createAsyncFunction(definirCaracteristicaWrapper)
    );

    // 3. Highlight padrão do Blockly
    ApiHelpers.registerFunction(
      interpreter,
      globalScope,
      "highlightBlock",
      ApiHelpers.createHighlightWrapper(scene),
      false,
    );
  };
};