/**
 * @fileoverview Configuração completa para o jogo Aspirador (Lógica e Navegação)
 * Com progressão pedagógica de 10 Fases (Nível 1 ao Nível 4)
 * @module games.aspirador.config.config
 */

export const gameConfig = {
  gameId: "aspirador",
  gameName: "Aspirador",
  type: "blocks",
  icon: "🧹",
  thumbnail: "/images/atividades/programacao/aspirador-thumbnail.png",
  descricao:
    "Programe um aspirador robô reativo. Aprenda do básico aos algoritmos avançados de navegação e variáveis.",
  dificuldade: "Iniciante",
  categoria: "Lógica",
  tempoEstimado: "30-45 min",
  conceitos: [
    "Sequenciamento",
    "Laços de Repetição (While/For)",
    "Condicionais (If/Else)",
    "Sensores de Colisão",
    "Variáveis (Incremento)",
    "Lógica de Negação (Não)"
  ],
  route: "/atividades/programacao/aspirador",
  component: "AspiradorGame",
  objectives: [
    "Compreender sequenciamento e repetições",
    "Utilizar sensores para tomada de decisão em tempo real",
    "Criar padrões expansivos usando variáveis numéricas",
    "Desenvolver algoritmos de cobertura de área (Zigue-zague e Espiral)"
  ],
  metadata: {
    lastUpdated: "2026-03-06",
    version: "2.0.0",
  },

  fases: [
    // ==========================================
    // NÍVEL 1: MOVIMENTO E PADRÕES
    // ==========================================
    {
      id: 1,
      nome: "Fase 1: A Linha Reta",
      descricao: "Use o bloco 'Enquanto houver sujeira' e o comando 'Mover' para ligá-lo.",
      timeout: 10,
      maxBlocks: 3,
      background: "piso_claro",
      allowedBlocks: ["controls_whileUntil", "robo_mover", "robo_ainda_tem_sujeira"],
      direcao: 90,
      matriz: [
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [4, 1, 2, 2, 2, 2, 2, 3, 0, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
      ],
      js: "while (aindaTemSujeira()) {\n  mover();\n}"
    },
    {
      id: 2,
      nome: "Fase 2: A Curva no Corredor",
      descricao: "Use o bloco de 'Repita X vezes' para andar, virar e andar de novo.",
      timeout: 15,
      maxBlocks: 7,
      background: "piso_claro",
      // Restringe ao laço numérico para treinar sequenciamento sem sensores ainda
      allowedBlocks: ["controls_repeat_ext", "math_number", "robo_mover", "robo_virar"],
      direcao: 90,
      matriz: [
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [4, 1, 2, 2, 2, 2, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 2, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 2, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 2, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 3, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
      ],
      js: "for (var i = 0; i < 4; i++) {\n  mover();\n}\nvirar('direita');\nfor (var j = 0; j < 3; j++) {\n  mover();\n}"
    },
    {
      id: 3,
      nome: "Fase 3: A Escadinha",
      descricao: "Crie uma escada colocando um 'Mover' e 'Virar' repetidas vezes.",
      timeout: 20,
      maxBlocks: 7,
      background: "piso_claro",
      allowedBlocks: ["controls_repeat_ext", "math_number", "robo_mover", "robo_virar"],
      direcao: 90,
      matriz: [
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [4, 1, 2, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 2, 2, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 2, 2, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 2, 2, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 2, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 4, 0, 0, 0, 0]
      ],
      js: "for (var i = 0; i < 4; i++) {\n  mover();\n  virar('direita');\n  mover();\n  virar('esquerda');\n}"
    },

    // ==========================================
    // NÍVEL 2: SENSORES E DECISÕES
    // ==========================================
    {
      id: 4,
      nome: "Fase 4: O Sensor de Impacto",
      descricao: "Use 'Se / Senão' e o Sensor: Se a frente estiver bloqueada por um vaso, vire. Senão, mova-se.",
      timeout: 20,
      maxBlocks: 6,
      background: "piso_claro",
      allowedBlocks: ["controls_whileUntil", "robo_if_else", "robo_mover", "robo_virar", "robo_bloqueado", "robo_ainda_tem_sujeira"],
      direcao: 90,
      matriz: [
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [4, 1, 2, 2, 2, 2, 2, 2, 4, 0],
        [0, 0, 0, 0, 0, 0, 0, 2, 0, 0],
        [0, 0, 0, 0, 0, 0, 0, 2, 0, 0],
        [0, 0, 0, 0, 0, 0, 0, 2, 0, 0],
        [0, 0, 0, 0, 0, 0, 0, 3, 0, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
      ],
      js: "while (aindaTemSujeira()) {\n  if (caminhoBloqueado('frente')) {\n    virar('direita');\n  } else {\n    mover();\n  }\n}"
    },
    {
      id: 5,
      nome: "Fase 5: Modo Bordas",
      descricao: "Limpe apenas os cantos da sala seguindo a parede até dar a volta.",
      timeout: 30,
      maxBlocks: 6,
      background: "piso_escuro",
      allowedBlocks: ["controls_whileUntil", "robo_if_else", "robo_mover", "robo_virar", "robo_bloqueado", "robo_ainda_tem_sujeira"],
      msgErroValidacao: "No modo bordas, o robô deve seguir a parede virando sempre para o mesmo lado (90° constantes).",
      direcao: 90,
      matriz: [
        [4, 3, 4, 3, 4, 3, 4, 3, 4, 3],
        [3, 1, 2, 2, 2, 2, 2, 2, 2, 4],
        [4, 2, 0, 0, 0, 0, 0, 0, 2, 3],
        [3, 2, 0, 0, 0, 0, 0, 0, 2, 4],
        [4, 2, 0, 0, 0, 0, 0, 0, 2, 3],
        [3, 2, 2, 2, 2, 2, 2, 2, 2, 4],
        [4, 3, 4, 3, 4, 3, 4, 3, 4, 3]
      ],
      js: "while (aindaTemSujeira()) {\n  if (caminhoBloqueado('frente')) {\n    virar('direita');\n  } else {\n    mover();\n  }\n}"
    },
    {
      id: 6,
      nome: "Fase 6: Desvio de Obstáculo",
      descricao: "Se o caminho à frente bloquear, você precisa dar a volta por fora e voltar ao trilho.",
      timeout: 35,
      maxBlocks: 12,
      background: "piso_claro",
      allowedBlocks: ["controls_whileUntil", "robo_if_else", "robo_mover", "robo_virar", "robo_bloqueado", "robo_ainda_tem_sujeira"],
      direcao: 90,
      matriz: [
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 2, 2, 2, 0, 0, 0, 0],
        [4, 1, 2, 4, 0, 2, 2, 2, 3, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
      ],
      js: "while (aindaTemSujeira()) {\n  if (caminhoBloqueado('frente')) {\n    virar('esquerda');\n    mover();\n    virar('direita');\n    mover();\n    mover();\n    virar('direita');\n    mover();\n    virar('esquerda');\n  } else {\n    mover();\n  }\n}"
    },

    // ==========================================
    // NÍVEL 3: VARIÁVEIS (PADRÕES CRESCENTES)
    // ==========================================
    {
      id: 7,
      nome: "Fase 7: A Escada Crescente",
      descricao: "Use a variável [passos] para fazer o robô acompanhar esse crescimento!",
      timeout: 30,
      maxBlocks: 15,
      background: "piso_claro",
      allowedBlocks: ["controls_repeat_ext", "math_number", "robo_passos_set", "robo_passos_get", "robo_passos_change", "robo_mover", "robo_virar"],
      direcao: 180, // Começa olhando para baixo
      validationRegex: /passos\s*(?:=\s*passos\s*\+\s*1|\+=\s*1|\+\+)/,
      msgErroIncremento: "Você precisa usar o bloco 'aumentar [passos] em 1' para o degrau crescer!",
      matriz: [
        [1, 4, 0, 0, 0, 0, 0, 0, 0, 3],
        [2, 2, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 2, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 2, 2, 2, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 2, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 2, 0, 0, 0, 0, 0, 0],
        [4, 0, 0, 2, 2, 2, 2, 3, 0, 4]
      ],
      js: "var passos = 1;\nfor (var i = 0; i < 3; i++) {\n  for (var j = 0; j < passos; j++) {\n    mover();\n  }\n  virar('esquerda');\n  for (var k = 0; k < passos; k++) {\n    mover();\n  }\n  virar('direita');\n  passos = passos + 1;\n}"
    },
    {
      id: 8,
      nome: "Fase 8: A Espiral de Limpeza",
      descricao: "Junte o que aprendeu sobre repetições com o aumento da variável para limpar do centro para as bordas.",
      timeout: 45, 
      maxBlocks: 15,
      background: "piso_claro",
      allowedBlocks: ["controls_whileUntil", "controls_repeat_ext", "math_number", "robo_passos_set", "robo_passos_get", "robo_passos_change", "robo_mover", "robo_virar", "robo_ainda_tem_sujeira", "robo_bloqueado", "robo_if", "robo_not"],
      direcao: 0,
      msgErroIncremento: "A espiral exige que a distância (variável passos) aumente a cada volta!",
      validationRegex: /passos\s*(?:=\s*passos\s*\+\s*1|\+=\s*1|\+\+)/, 
      matriz: [
        [4, 0, 0, 0, 0, 0, 0, 0, 0, 3],
        [0, 0, 2, 2, 2, 2, 2, 0, 0, 0],
        [0, 0, 2, 2, 2, 2, 2, 0, 0, 0],
        [0, 0, 2, 2, 1, 2, 2, 0, 0, 0],
        [0, 0, 2, 2, 2, 2, 2, 0, 0, 0],
        [0, 0, 2, 2, 2, 2, 2, 0, 0, 0],
        [3, 0, 0, 0, 0, 0, 0, 0, 0, 4]
      ],
      js: "var passos = 1;\nwhile (aindaTemSujeira()) {\n  for (var i = 0; i < 2; i++) {\n    for (var j = 0; j < passos; j++) {\n      if (!caminhoBloqueado('frente')) {\n        mover();\n      }\n    }\n    virar('direita');\n  }\n  passos = passos + 1;\n}"
    },

    // ==========================================
    // NÍVEL 4: LÓGICA AVANÇADA
    // ==========================================
    {
      id: 9,
      nome: "Fase 9: O Labirinto Cego",
      descricao: "Se a frente estiver bloqueada, teste a direita! Se a direita também bloquear, vire à esquerda.",
      timeout: 45,
      maxBlocks: 10,
      background: "piso_claro",
      allowedBlocks: ["controls_whileUntil", "robo_if_else", "robo_if", "robo_mover", "robo_virar", "robo_bloqueado", "robo_ainda_tem_sujeira"],
      direcao: 90,
      matriz: [
        [1, 2, 2, 2, 2, 2, 2, 2, 2, 2],
        [4, 3, 4, 3, 4, 3, 4, 3, 4, 2], // Parede força a descer
        [2, 2, 2, 2, 2, 2, 2, 2, 2, 2],
        [2, 4, 3, 4, 3, 4, 3, 4, 3, 4], // Parede força a descer pela esquerda
        [2, 2, 2, 2, 2, 2, 2, 2, 2, 2],
        [4, 3, 4, 3, 4, 3, 4, 3, 4, 2], // Parede força a descer pela direita
        [2, 2, 2, 2, 2, 2, 2, 2, 2, 2]
      ],
      js: "while (aindaTemSujeira()) {\n  if (caminhoBloqueado('frente')) {\n    if (caminhoBloqueado('direita')) {\n      virar('esquerda');\n    } else {\n      virar('direita');\n    }\n  } else {\n    mover();\n  }\n}"
    },
    {
      id: 10,
      nome: "Fase 10: Zigue-Zague",
      descricao: "Crie um algoritmo de espelhamento (Zigue-Zague) combinando o bloco 'NÃO' e os sensores.",
      timeout: 60,
      maxBlocks: 21,
      background: "piso_claro",
      allowedBlocks: ["controls_whileUntil", "robo_if", "robo_if_else", "robo_not", "robo_mover", "robo_virar", "robo_bloqueado", "robo_ainda_tem_sujeira"],
      direcao: 90,
      msgErroValidacao: "Para limpar tudo sem gastar bateria, você deve alternar as viradas (Esquerda e Direita) num padrão de espelho perfeito!",
      matriz: [
        [1, 2, 2, 2, 2, 2, 2, 2, 2, 2],
        [2, 2, 2, 2, 2, 2, 2, 2, 2, 2],
        [2, 2, 2, 2, 2, 2, 2, 2, 2, 2],
        [2, 2, 2, 2, 2, 2, 2, 2, 2, 2],
        [2, 2, 2, 2, 2, 2, 2, 2, 2, 2],
        [2, 2, 2, 2, 2, 2, 2, 2, 2, 2],
        [2, 2, 2, 2, 2, 2, 2, 2, 2, 2]
      ],
      js: "while (aindaTemSujeira()) {\n  if (caminhoBloqueado('frente')) {\n    virar('direita');\n    if (!caminhoBloqueado('frente')) {\n      mover();\n      virar('direita');\n      while (!caminhoBloqueado('frente')) {\n        mover();\n      }\n      virar('esquerda');\n      if (!caminhoBloqueado('frente')) {\n        mover();\n        virar('esquerda');\n      }\n    }\n  } else {\n    mover();\n  }\n}"
    }
  ],

  mensagens: {
    entradaIncorreta: "Seu robô está parado! Verifique se você usou os blocos de Movimento.",
    saidaIncorreta: "O robô bateu ou ficou preso! Revise sua lógica de sensores e curvas.",
    erroGeral: "O sistema de navegação falhou. Reinicie os blocos e tente uma nova estratégia.",
    sucessoGenerico: "Excelente! Missão concluída.",
    timeoutExcedido: "Bateria esgotada! O robô não conseguiu limpar tudo a tempo. Tente um caminho mais eficiente.",
  },
};