// hiraishin-system.js
import { world } from "@minecraft/server";
import { ActionFormData } from "@minecraft/server-ui";

// ----------------------
// Configuração de custos em chakra
// ----------------------
const HIRAISHIN_COST = {
  mark: 50,       // chakra para marcar
  teleport: 150,  // chakra para teleportar
  projectile: 6   // chakra por disparo
};

// ----------------------
// Registro de propriedades dinâmicas
// ----------------------
world.afterEvents.worldInitialize.subscribe(ev => {
  const reg = ev.propertyRegistry;
  reg.registerEntityTypeDynamicProperties({ identifier: "hiraishin_locations", type: "string" }, "minecraft:player");
});

// ----------------------
// Utilitários de chakra
// ----------------------
function getProp(player, name) {
  return parseInt(player.getDynamicProperty(name)) || 0;
}
function setProp(player, name, val) {
  player.setDynamicProperty(name, val);
}
function consumirChakra(player, custo) {
  const chakra = getProp(player, "chakraCarga");
  if (chakra < custo) {
    player.sendMessage("§cSeu chakra não é suficiente!");
    return false;
  }
  setProp(player, "chakraCarga", chakra - custo);
  return true;
}

// ----------------------
// Persistência de marcas
// ----------------------
function getHiraishinLocations(player) {
  try {
    const str = player.getDynamicProperty("hiraishin_locations");
    if (str) return JSON.parse(str);
  } catch {}
  return [];
}
function saveHiraishinLocations(player, locations) {
  player.setDynamicProperty("hiraishin_locations", JSON.stringify(locations));
}

// ----------------------
// Menu principal
// ----------------------
function abrirMenuHiraishin(player) {
  const locais = getHiraishinLocations(player);

  const form = new ActionFormData()
    .title(":zenkai_ui:✦ Técnica Hiraishin ✦")
    .body("§7Selecione o que deseja fazer:");

  form.button("§a➤ Criar nova marca");
  locais.forEach(loc => form.button(`§b➤ Ir para: ${loc.name}`));
  if (locais.length > 0) form.button("§c➤ Editar/Remover marcas");

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

    if (res.selection === 0) {
      gerarNomeAutomatico(player);
      return;
    }

    if (locais.length > 0 && res.selection === locais.length + 1) {
      abrirMenuGerenciar(player);
      return;
    }

    const idx = res.selection - 1;
    if (idx >= 0 && idx < locais.length) {
      iniciarTeleporte(player, locais[idx]);
    }
  });
}

// ----------------------
// Gerar nome automático
// ----------------------
function gerarNomeAutomatico(player) {
  const locais = getHiraishinLocations(player);
  const novoNome = `Marca ${locais.length + 1}`;
  marcarLocal(player, novoNome);
}

// ----------------------
// Criar/atualizar marca
// ----------------------
function marcarLocal(player, nome) {
  if (!consumirChakra(player, HIRAISHIN_COST.mark)) return;

  const locais = getHiraishinLocations(player);
  const novo = {
    name: nome,
    x: Math.floor(player.location.x),
    y: Math.floor(player.location.y),
    z: Math.floor(player.location.z),
    dimension: player.dimension.id
  };

  locais.push(novo);
  player.sendMessage(`§eMarca '${nome}' criada!`);

  // Som ao criar marca
  player.dimension.runCommandAsync(`playsound seal_d @a[r=15] ~ ~ ~ 1 1`);

  saveHiraishinLocations(player, locais);
  abrirMenuHiraishin(player);
}

// ----------------------
// Teleporte
// ----------------------
function iniciarTeleporte(player, loc) {
  if (!consumirChakra(player, HIRAISHIN_COST.teleport)) return;

  const dim = world.getDimension(loc.dimension || "minecraft:overworld");
  player.sendMessage(`§bVocê canaliza chakra e se move até '${loc.name}'...`);

  // Som ao teleportar
  player.runCommandAsync(`playsound seal_d @s ~ ~ ~ 1 1`);
  player.teleport({ x: loc.x + 0.5, y: loc.y, z: loc.z + 0.5 }, { dimension: dim });
  player.sendMessage(`§aChegou em '${loc.name}'!`);
}

// ----------------------
// Menu de gerenciamento
// ----------------------
function abrirMenuGerenciar(player) {
  const locais = getHiraishinLocations(player);
  if (locais.length === 0) {
    player.sendMessage("§cVocê não tem nenhuma marca Hiraishin!");
    abrirMenuHiraishin(player);
    return;
  }

  const form = new ActionFormData()
    .title(":zenkai_ui:✦ Gerenciar Marcas ✦")
    .body("§7Selecione uma marca para remover:");

  locais.forEach(loc => form.button(`§cRemover: ${loc.name}`));
  form.button("§9Voltar");

  form.show(player).then(res => {
    if (res.canceled) {
      abrirMenuHiraishin(player);
      return;
    }
    if (res.selection === locais.length) {
      abrirMenuHiraishin(player);
      return;
    }
    removerMarca(player, res.selection);
  });
}

// ----------------------
// Remover marca
// ----------------------
function removerMarca(player, idx) {
  const locais = getHiraishinLocations(player);
  if (idx >= 0 && idx < locais.length) {
    const removida = locais[idx];
    locais.splice(idx, 1);
    saveHiraishinLocations(player, locais);
    player.sendMessage(`§cMarca '${removida.name}' removida!`);
  }
  abrirMenuHiraishin(player);
}

// ----------------------
// Sistema de projétil
// ----------------------
const temposRecarga = new Map();

function dispararProjetil(player) {
  const agora = Date.now();
  const ultimoUso = temposRecarga.get(player.id) || 0;
  const tempoEspera = 1000; // 1 segundo

  if (agora - ultimoUso < tempoEspera) {
    const falta = Math.ceil((tempoEspera - (agora - ultimoUso)) / 1000);
    player.sendMessage(`§cAguarde ${falta}s para usar novamente.`);
    return;
  }

  // Consome chakra
  if (!consumirChakra(player, HIRAISHIN_COST.projectile)) return;

  temposRecarga.set(player.id, agora);

  const direcao = player.getViewDirection();
  const head = player.getHeadLocation();
  const dimensao = player.dimension;

  const spawnPos = {
    x: head.x + direcao.x * 2,
    y: head.y + direcao.y * 2,
    z: head.z + direcao.z * 2
  };

  const proj = dimensao.spawnEntity("nz:hiraishin_bullet", spawnPos);

  const forca = 3;
  proj.applyImpulse({
    x: direcao.x * forca,
    y: direcao.y * forca,
    z: direcao.z * forca
  });

  const comp = proj.getComponent("minecraft:projectile");
  if (comp) comp.owner = player;

  // Som ao lançar projétil
  player.runCommandAsync(`playsound seal_c @s ~ ~ ~ 1 1`);
}

// ----------------------
// Controle de uso do item
// ----------------------
world.afterEvents.itemUse.subscribe(ev => {
  const player = ev.source;
  const item = ev.itemStack;
  if (!item || item.typeId !== "nz:hiraishin") return;

  if (player.isSneaking) {
    abrirMenuHiraishin(player);
  } else {
    dispararProjetil(player);
  }
});