/**
 * @fileoverview Definição de blocos customizados e geradores para o jogo Aspirador
 * @module games.aspirador.blocks.blocks
 */

"use strict";

import * as Blockly from "blockly/core";
import "blockly/blocks";
import { javascriptGenerator } from "blockly/javascript";
import { CORES_BLOCKLY, CORES_CUSTOMIZADAS } from "@/blockly/blocklyColors";
import { configurarGerador, gerarExpressao,gerarStatement, gerarStatementInline, gerarStatementComCampo, gerarExpressaoComCampo, gerarStatementComValor } from "@/blockly/generator";
import { gerarToolboxDeEstrutura } from "@/blockly/toolbox";
import { criarBlocoStatementSimples, criarBlocoStatementComDropdown, criarBlocoStatementComValor, criarBlocoExpressaoSimples, criarBlocoExpressaoComDropdown, criarBlocoCondicional, criarBlocoNegacao } from "@/blockly/blockFactory";

const ESTRUTURA_TOOLBOX = [
  { 
    nome: "Lógica", 
    cssContainer: "cat_logica",
    blocos: ["robo_if", "robo_if_else", "robo_not"]
  },
  { 
    nome: "Repetição", 
    cssContainer: "cat_repeticao",
    blocos: ["controls_whileUntil", "controls_repeat_ext"]
  },
  { 
    nome: "Movimento", 
    cor: CORES_CUSTOMIZADAS.MOVIMENTO,
    cssContainer: "cat_movimento",
    blocos: ["robo_mover", "robo_virar"]
  },
  { 
    nome: "Sensores", 
    cor: CORES_CUSTOMIZADAS.SENSORES,
    cssContainer: "cat_sensores",
    blocos: ["robo_ainda_tem_sujeira", "robo_bloqueado"]
  },
  { 
    nome: "Variáveis", 
    cssContainer: "cat_variaveis",
    blocos: ["robo_passos_set", "robo_passos_get", "robo_passos_change"]
  },
  { 
    nome: "Matemática", 
    cssContainer: "cat_matematica",
    blocos: ["math_number"]
  },
];

export const registerBlocks = () => {
  defineBlocks();
  defineGenerators();
};

export const generateDynamicToolbox = (allowedBlocks = []) => {
  return gerarToolboxDeEstrutura(ESTRUTURA_TOOLBOX, allowedBlocks);
};

const defineBlocks = () => {
  // LÓGICA
  criarBlocoCondicional("robo_if", {
    textoCondicao: "se",
    statements: [{ nome: "FACA", texto: "faça" }],
    cor: CORES_BLOCKLY.LOGICA
  });

  criarBlocoCondicional("robo_if_else", {
    textoCondicao: "se",
    statements: [
      { nome: "FACA", texto: "faça" },
      { nome: "SENAO", texto: "senão" }
    ],
    cor: CORES_BLOCKLY.LOGICA
  });

  criarBlocoNegacao(
    "robo_not",
    "não",
    CORES_BLOCKLY.LOGICA,
    "Inverte o resultado do sensor (ex: de 'bloqueado' para 'não bloqueado')."
  );

  // MOVIMENTO
  criarBlocoStatementSimples(
    "robo_mover",
    "mover para FRENTE",
    CORES_CUSTOMIZADAS.MOVIMENTO
  );

  criarBlocoStatementComDropdown(
    "robo_virar",
    "virar para a",
    [["DIREITA", "DIREITA"], ["ESQUERDA", "ESQUERDA"]],
    "DIRECAO",
    CORES_CUSTOMIZADAS.MOVIMENTO
  );

  // SENSORES
  criarBlocoExpressaoSimples(
    "robo_ainda_tem_sujeira",
    "ainda tem sujeira?",
    "Boolean",
    CORES_CUSTOMIZADAS.SENSORES
  );

  criarBlocoExpressaoComDropdown(
    "robo_bloqueado",
    "caminho bloqueado à",
    [["FRENTE", "FRENTE"], ["DIREITA", "DIREITA"], ["ESQUERDA", "ESQUERDA"]],
    "SENTIDO",
    "Boolean",
    CORES_CUSTOMIZADAS.SENSORES
  );

  // VARIÁVEIS
  criarBlocoStatementComValor(
    "robo_passos_set",
    "definir PASSOS para",
    "VALOR",
    "Number",
    CORES_BLOCKLY.VARIAVEIS
  );

  criarBlocoExpressaoSimples(
    "robo_passos_get",
    "PASSOS",
    "Number",
    CORES_BLOCKLY.VARIAVEIS
  );

  criarBlocoStatementSimples(
    "robo_passos_change",
    "aumentar PASSOS em 1",
    CORES_BLOCKLY.VARIAVEIS
  );
};

const defineGenerators = () => {
  configurarGerador();

  // LÓGICA - Geradores complexos mantidos explícitos
  javascriptGenerator.forBlock["robo_if"] = function (block) {
    let condicao = javascriptGenerator.valueToCode(block, "CONDICAO", javascriptGenerator.ORDER_NONE) || "false";
    return `if (${condicao}) {\n${javascriptGenerator.statementToCode(block, "FACA")}}\n`;
  };

  javascriptGenerator.forBlock["robo_if_else"] = function (block) {
    let condicao = javascriptGenerator.valueToCode(block, "CONDICAO", javascriptGenerator.ORDER_NONE) || "false";
    return `if (${condicao}) {\n${javascriptGenerator.statementToCode(block, "FACA")}} else {\n${javascriptGenerator.statementToCode(block, "SENAO")}}\n`;
  };

  javascriptGenerator.forBlock["robo_not"] = function (block) {
    let innerCode = javascriptGenerator.valueToCode(block, "BOOL", javascriptGenerator.ORDER_LOGICAL_NOT) || "false";
    return [`!${innerCode}`, javascriptGenerator.ORDER_LOGICAL_NOT];
  };

  // MOVIMENTO - Agora com helpers
  gerarStatement("robo_mover", "mover");
  gerarStatementComCampo("robo_virar", "virar", "DIRECAO");

  // SENSORES - Agora com helpers
  gerarExpressao("robo_ainda_tem_sujeira", "aindaTemSujeira()", javascriptGenerator.ORDER_FUNCTION_CALL);
  gerarExpressaoComCampo("robo_bloqueado", "caminhoBloqueado", "SENTIDO", javascriptGenerator.ORDER_FUNCTION_CALL);

  // VARIÁVEIS - Agora com helpers
  gerarStatementComValor("robo_passos_set", "VALOR", (valor) => `var passos = ${valor}`);
  gerarExpressao("robo_passos_get", "passos");
  gerarStatementInline("robo_passos_change", "passos = passos + 1");
};