import * as mc from '@minecraft/server';

// =====================================================
// 🔵 Criar scoreboards corretamente ao iniciar o mundo
// =====================================================
function criarScoreboards() {
  // Adicionando todos os scores usados no sistema de HUD e Skills
  const boards = ["chakra", "chakraMax", "level", "xp", "choose", "Tp", "Melee", "velocidade", "defesa", "forca", "vida", "Sword", "dash", "skill_sword", "dash_count"];

  for (const obj of boards) {
    try {
      mc.world.scoreboard.addObjective(obj, obj);
    } catch {
      // Já existe
    }
  }
}

mc.system.runTimeout(() => {
  criarScoreboards();
}, 20);

// =====================================================
// Funções seguras de Scoreboard (getScore e setScore)
// =====================================================
function getScore(player, objective) {
  try {
    const obj = mc.world.scoreboard.getObjective(objective);
    if (!obj) return 0;
    return obj.getScore(player.scoreboardIdentity) ?? 0;
  } catch {
    return 0;
  }
}

// Usando player.runCommandAsync para setar o score, como no código original do usuário
function setScore(player, objective, value) {
  player.runCommandAsync(`scoreboard players set @s ${objective} ${value}`);
}

// =====================================================
// 🟢 FUNÇÃO DE SKILLS (openSkillsMenu)
// =====================================================

function openSkillsMenu(player) {
  // ====== PEGAR SCORES (Usando "Tp" para consistência) ======
  const melee = getScore(player, "Melee") || 0;
  const sword = getScore(player, "Sword") || 0;
  const skillSword = getScore(player, "skill_sword") || 0; 
  const Tp = getScore(player, "Tp") || 0; // Nome do score padronizado como "Tp"
  const dashMaxQuantity = getScore(player, "dash") || 1; 
  
  // ====== CUSTOS ======
  const custoMelee = 10 + melee * 5;
  const custoSword = 10 + sword * 5;
  const custoDash = 50 + dashMaxQuantity * 25; 

  // ====== TAG DE ÁGUA ======
  const temAgua = player.hasTag("agua") ? "§aATIVADO" : "§cDESATIVADO";

  // Define o nível máximo para o Dash (1 base + 5 compras = 6)
  const MAX_DASH_LEVEL = 6; 

  // ====== MENU ======
  const form = new ActionFormData() 
    .title("§8Skills")
    .body(
      `§d Melee: ${melee}
§9 Sword: ${sword} (Skill: ${skillSword})
§e Dash Máximo: ${dashMaxQuantity}
§b Andar na água: ${temAgua}

§9TP: ${Tp}`
    )
    .button(`§d↑ Melee (+1) §9[${custoMelee} TP]`)     // 0
    .button(`§9↑ Sword (+1) §9[${custoSword} TP]`)     // 1
    // O texto do botão agora muda se atingir o limite
    .button(dashMaxQuantity >= MAX_DASH_LEVEL ? `§cDash Máximo (LIMITE MÁXIMO)` : `§e↑ Dash Máximo (+1) §9[${custoDash} TP]`) // 2
    .button(`§bAndar na água (${temAgua})`)            // 3
    .button("§8← Voltar");                             // 4

  form.show(player).then((res) => {
    if (res.canceled) return; 

    switch (res.selection) {

      // ================= MELEE =================
      case 0:
        if (Tp < custoMelee) return player.sendMessage("§cTP insuficiente!");
        
        // 2. TIRA O TP APÓS A COMPRA (USANDO "Tp")
        setScore(player, "Tp", Tp - custoMelee); 
        
        setScore(player, "Melee", melee + 1);
        player.sendMessage("§dMelee aumentou!");
        break;

      // ================= SWORD =================
      case 1:
        if (Tp < custoSword) return player.sendMessage("§cTP insuficiente!");
        
        // 2. TIRA O TP APÓS A COMPRA (USANDO "Tp")
        setScore(player, "Tp", Tp - custoSword);
        
        setScore(player, "Sword", sword + 1);
        setScore(player, "skill_sword", skillSword + 1); 
        player.sendMessage("§9Sword aumentou! Skill também evoluiu!");
        break;

      // ================= DASH =================
      case 2:
        if (dashMaxQuantity >= MAX_DASH_LEVEL) {
            return player.sendMessage("§cVocê já atingiu o limite máximo de Dash Máximo!");
        }

        if (Tp < custoDash) return player.sendMessage("§cTP insuficiente!");
        
        // 2. TIRA O TP APÓS A COMPRA (USANDO "Tp")
        setScore(player, "Tp", Tp - custoDash);
        
        // Adiciona a tag na primeira compra (quando dashMaxQuantity é 1)
        if (dashMaxQuantity === 1) {
             player.addTag("pkde_dash");
             player.sendMessage("§aTag 'pkde_dash' desbloqueada! Use a habilidade.");
        }

        // Aumenta a Quantidade Máxima de Dash
        const newDashMaxQuantity = dashMaxQuantity + 1;
        setScore(player, "dash", newDashMaxQuantity); 
        
        // Adiciona 1 ao dash_count via comando, como solicitado
        player.runCommandAsync('scoreboard players add @s dash_count 1');
        
        // Mensagem genérica
        player.sendMessage("§eDash Máximo aumentou!"); 
        break;

      // ============ ANDAR NA ÁGUA ============
      case 3:
        if (player.hasTag("agua")) {
          player.removeTag("agua");
          player.sendMessage("§cAndar na água desativado!");
        } else {
          player.addTag("agua");
          player.sendMessage("§bAgora você pode andar na água!");
        }
        break;

      // ============ VOLTAR ============
      case 4:
        return;
    }
  });
}

// =====================================================
// 🔵 LOOP PRINCIPAL (Função de HUD e Lógica central)
// =====================================================
mc.system.runInterval(() => {
  for (const player of mc.world.getPlayers()) {

    // HEALTH
    const hpComponent = player.getComponent("health");
    let health = Math.floor(hpComponent?.currentValue ?? 0);
    let maxHealth = Math.floor(hpComponent?.effectiveMax ?? 20);

    // SCOREBOARDS
    let chakra = getScore(player, "chakra");
    let level = getScore(player, "level");
    let chakraMax = getScore(player, "chakraMax");
    let xp = getScore(player, "xp");
    let Tp = getScore(player, "Tp"); // Score Tp
    
    // ... (restante da lógica do Loop, sem alterações) ...
    
    // =====================================================
    // 🔵 LEVEL DEFINE CHAKRA MAX (igual aos comandos)
    // =====================================================

    let novoMax = chakraMax;

    const tabelaChakra = {
      0: 100, 1: 150, 2: 200, 3: 250, 4: 300, 5: 350, 6: 400, 7: 450, 8: 500, 9: 550, 
      10: 600, 11: 650, 12: 700, 13: 750, 14: 800, 15: 850, 16: 900, 17: 950
    };

    if (tabelaChakra[level] !== undefined) {
      novoMax = tabelaChakra[level];
    } else if (level >= 18) {
      novoMax = 1000;
    }

    // Atualiza caso mude
    if (chakraMax !== novoMax) {
      chakraMax = novoMax;
      setScore(player, "chakraMax", chakraMax);
    }

    // =====================================================
    // 🔵 LIMITES
    // =====================================================

    if (chakra > chakraMax) {
      chakra = chakraMax;
      setScore(player, "chakra", chakraMax);
    }

    if (chakra < 0) {
      chakra = 0;
      setScore(player, "chakra", 0);
    }

    if (xp < 0) {
      xp = 0;
      setScore(player, "xp", 0);
    }

    // =====================================================
    // 🔵 CLÃ
    // =====================================================
    let clan = "Sem Clã";
    const clans = [
      ["Uzumaki", "Clã Uzumaki"],
      ["Uchiha", "Clã Uchiha"],
      ["Senju", "Clã Senju"],
      ["Hyuuga", "Clã Hyūga"],
      ["nara", "Clã Nara"],
      ["yamanaka", "Clã Yamanaka"],
      ["akimichi", "Clã Akimichi"],
      ["Aburame", "Clã Aburame"],
      ["Kaguya", "Clã Kaguya"]
    ];

    for (const [tag, nome] of clans) {
      if (player.hasTag(tag)) {
        clan = nome;
        break;
      }
    }

    // =====================================================
    // 🔵 HUD NA TELA
    // =====================================================
    player.onScreenDisplay.setActionBar(
      ` ${health}/${maxHealth}\nChakra: ${chakra}/${chakraMax}\nLevel: ${level}\nXP: ${xp}\nTP: ${Tp}\n${clan}`
    );

    // =====================================================
    // 🔵 REGEN DE CHAKRA (agachar)
    // =====================================================
    if (player.isSneaking && chakra < chakraMax) {
      setScore(player, "chakra", chakra + 5);
    }
  }
}, 10);
