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

// ----------------------
// Configurações
// ----------------------
const jumpWindow = 15;     // Máx. ticks entre pulos para ser considerado "pulo duplo"
const dashCostStamina = 15; // 🔑 custo de stamina por dash

const lastJump = new Map();

// ----------------------
// Funções de Stamina
// ----------------------
function getStamina(player) {
    try {
        const obj = mc.world.scoreboard.getObjective("Stamina");
        return obj ? (obj.getScore(player.scoreboardIdentity) ?? 0) : 0;
    } catch (e) { return 0; }
}

function setStamina(player, value) {
    try {
        let obj = mc.world.scoreboard.getObjective("Stamina");
        if (!obj) {
            mc.world.scoreboard.addObjective("Stamina", "Stamina");
            obj = mc.world.scoreboard.getObjective("Stamina");
        }
        obj.setScore(player.scoreboardIdentity, value);
    } catch (e) {}
}

// ----------------------
// LOOP PRINCIPAL: DETECÇÃO DE PULO DUPLO
// ----------------------
mc.system.runInterval(() => {
  const tick = mc.system.currentTick;

  for (const player of mc.world.getPlayers()) {
    const name = player.name;
    const velY = player.getVelocity().y;
    const isJumping = velY > 0.25 && !player.isOnGround;

    // 🔑 Só funciona se tiver a tag pode_dash
    if (!player.hasTag("pode_dash")) continue;

    if (isJumping && player.isSprinting) {
      const last = lastJump.get(name);

      if (last && tick - last < jumpWindow) {
        // Pulo duplo detectado → Dash
        const stamina = getStamina(player);
        if (stamina >= dashCostStamina) {
            setStamina(player, stamina - dashCostStamina);
            player.addTag("ativar_dash_2");
        } else {
            player.sendMessage("§cStamina insuficiente para dar dash!");
        }
        lastJump.delete(name);
      } else {
        // Primeiro pulo
        lastJump.set(name, tick);
      }
    }

    // Reset se encostar no chão
    if (player.isOnGround) {
      lastJump.delete(name);
    }
  }
}, 1);

// ----------------------
// LOOP DE EXECUÇÃO DO DASH
// ----------------------
mc.system.runInterval(() => {
    for (const player of mc.world.getPlayers()) {
        if (player.hasTag("ativar_dash")) {
            dash(player);
            player.removeTag("ativar_dash");
        }

        if (player.hasTag("ativar_dash_2")) {
            dash_2(player);
            player.removeTag("ativar_dash_2");
        }
    }
}, 2);

// ----------------------
// FUNÇÕES DE DASH
// ----------------------
function dash(player) {
    const velo = player.getVelocity();
    const rot = player.getRotation();

    let rot_math = Math.floor(Math.atan2(velo.z, velo.x) * 180 / Math.PI - 90);
    if (rot_math < -180) rot_math += 360;

    let rot_calc = Math.abs(rot_math - Math.floor(rot.y));
    rot_calc = Math.min(rot_calc, 360 - rot_calc);

    const dashAnim = (rot_calc > 120) ? "animation.dash.back" : "animation.dash.front";

    player.applyKnockback(velo.x, velo.z, 3, 0.3);
    player.playAnimation(dashAnim, { controller: "dash_controller" });
}

function dash_2(player) {
    const velo = player.getVelocity();
    const rot = player.getRotation();

    let rot_math = Math.floor(Math.atan2(velo.z, velo.x) * 180 / Math.PI - 90);
    if (rot_math < -180) rot_math += 360;

    let rot_calc = Math.abs(rot_math - Math.floor(rot.y));
    rot_calc = Math.min(rot_calc, 360 - rot_calc);

    const dashAnim = "animation.dash_2";

    player.applyKnockback(velo.x, velo.z, 3, 0.3);
    player.playAnimation(dashAnim, { controller: "dash_2_controller" });
}