import { world, system } from "@minecraft/server";

// ----------------------
// Configuração dos NPCs, jutsus e sons
// ----------------------
const NPC_JUTSU_MAP = {
  "nz:madara_mangekyou": {
    jutsus: [
      {
        id: "Flor de Fenix",
        projectile: "nz:flor_de_fenix_bullet",
        particle: "nz:fogo",
        force: 3.0,
        chance: 0.3,       // 30% de chance
        hitsRequired: 3,   // só verifica a cada 6 ataques
        sound: "seal_d"    // som ao lançar
      }
    ]
  },
  "nz:zabuza_boss": {
    jutsus: [
      {
        id: "Jutsu de agua",
        projectile: "nz:dragao_de_agua",
        particle: "nz:agua",
        force: 3.0,
        chance: 0.6,       // 30% de chance
        hitsRequired: 5,   // só verifica a cada 6 ataques
        sound: "seal_d"    // som ao lançar
      }
    ]
  },
  "nz:kisame_boss_v2": {
    jutsus: [
      {
        id: "Jutsu de Agua",
        projectile: "nz:jutsu_ondas_furiosas",
        particle: "nz:agua",
        force: 2.5,
        chance: 0.3,       // 50% de chance
        hitsRequired: 5,   // a cada 5 ataques
        sound: "seal_d"
      }
    ]
  }
};

// ----------------------
// Controle de contagem de hits por NPC
// ----------------------
const npcHitCounter = new Map();

// ----------------------
// Função para disparar jutsu mirando no alvo
// ----------------------
function dispararJutsu(npc, jutsu, target) {
  const head = npc.getHeadLocation();
  const spawnPos = { x: head.x, y: head.y, z: head.z };

  // Calcula vetor direção do NPC até o alvo
  const dir = {
    x: target.location.x - head.x,
    y: target.location.y - head.y,
    z: target.location.z - head.z
  };

  // Normaliza o vetor
  const length = Math.sqrt(dir.x*dir.x + dir.y*dir.y + dir.z*dir.z);
  const norm = { x: dir.x/length, y: dir.y/length, z: dir.z/length };

  // Delay de 1.25 segundos antes de lançar
  system.runTimeout(() => {
    try {
      const projectile = npc.dimension.spawnEntity(jutsu.projectile, spawnPos);
      projectile.applyImpulse({
        x: norm.x * jutsu.force,
        y: norm.y * jutsu.force,
        z: norm.z * jutsu.force
      });

      npc.dimension.spawnParticle(jutsu.particle, head);

      // Som do jutsu (para todos jogadores próximos ao NPC)
      if (jutsu.sound) {
        npc.dimension.runCommandAsync(
          `playsound ${jutsu.sound} @a[r=15] ${npc.location.x} ${npc.location.y} ${npc.location.z} 1 1`
        );
      }

      npc.sendMessage(`§6${jutsu.id} lançado contra ${target.typeId}!`);
    } catch (e) {
      npc.dimension.spawnParticle("minecraft:smoke", npc.location);
    }
  }, 25); // 25 ticks = 1.25s
}

// ----------------------
// Evento: quando NPC atacar alguém
// ----------------------
world.afterEvents.entityHitEntity.subscribe(ev => {
  const attacker = ev.damagingEntity;
  const victim = ev.hitEntity;

  if (!attacker || !NPC_JUTSU_MAP[attacker.typeId]) return;

  const config = NPC_JUTSU_MAP[attacker.typeId];
  const key = attacker.id;

  // Atualiza contador de hits
  const hits = (npcHitCounter.get(key) || 0) + 1;
  npcHitCounter.set(key, hits);

  // Para cada jutsu configurado
  config.jutsus.forEach(jutsu => {
    if (hits % jutsu.hitsRequired === 0) {
      if (Math.random() < jutsu.chance) {
        dispararJutsu(attacker, jutsu, victim);
      }
    }
  });
});