import { world, system } from "@minecraft/server";
import { ActionFormData } from "@minecraft/server-ui";
import { ITEMS, MISSOES } from "./config.js";
import { iniciarSistemas } from "./system.js";
import { openStatusMenu, openClanMenu } from "./menus.js";


iniciarSistemas();

system.runTimeout(() => {
  const cmds = [
    "scoreboard objectives add TP dummy TP",
    "scoreboard objectives add Ryo dummy RYO",
    "scoreboard objectives add XP dummy XP",
    "scoreboard objectives add Lvl dummy Level",
    "scoreboard objectives add karma dummy Karma",
    "scoreboard objectives add MissoesConcluidas dummy MissoesConcluidas",
    "scoreboard objectives add missao4_mortes dummy Missao4Mortes",
    "scoreboard objectives add gedo_mazou dummy GedoMazou",
    "scoreboard objectives add Stamina dummy Stamina",
    "scoreboard objectives add vida dummy Vida",
    "scoreboard objectives add forca dummy Forca",
    "scoreboard objectives add velocidade dummy Velocidade",
    "scoreboard objectives add defesa dummy Defesa",
    "scoreboard objectives add chakraUp dummy ChakraUp",
    "scoreboard objectives add staminaUp dummy StaminaUp",
    "scoreboard objectives add dash_count dummy Dash"
  ];
  for (const cmd of cmds) {
    try {
      world.getDimension("overworld").runCommandAsync(cmd);
    } catch {}
  }
}, 5);

const RANKS = [
  "Shinobi","Genin","Chunin","Jonin","Anbu","Monarca","Nukenin","Hokage","Deus",
  "Mizukage","Kazekage","Tsuchikage","Raikage","VIP","Akatsuki","Kara","7-Espadas","Renegado"
];

const MEMBROS = ["Contratado"];
const VILAS = ["Folha","Areia","Nuvem","Redemoinho","Nevoa","Pedra","Madeira","Gelo","Chuva"];

function getScore(player, obj) {
  try {
    const o = world.scoreboard.getObjective(obj);
    if (!o) return 0;
    return o.getScore(player) || 0;
  } catch {
    return 0;
  }
}

function setScore(player, obj, val) {
  try {
    player.runCommandAsync(`scoreboard players set @s ${obj} ${val}`);
  } catch {}
}

function addScore(player, obj, delta) {
  try {
    player.runCommandAsync(`scoreboard players add @s ${obj} ${delta}`);
  } catch {}
}

function hasAnyTag(player, tags) {
  const set = new Set(player.getTags());
  return tags.some(t => set.has(t));
}

function atualizarNameTag(player) {
  const rankTag = player.getTags().find(t => RANKS.includes(t)) || "Sem Rank";
  const membroTag = player.getTags().find(t => MEMBROS.includes(t)) || "";
  const vilaTag = player.getTags().find(t => VILAS.includes(t)) || "Nenhuma";

  let nameTag = `§d[${rankTag}] `;
  if (membroTag) nameTag += `§c[${membroTag}] `;
  nameTag += `§a[${vilaTag}] §f${player.name}`;

  player.nameTag = nameTag;
}


const lastLevels = new Map(); // player.id -> último nível

system.runInterval(() => {
  for (const player of world.getPlayers()) {
    try {
      const lvl = getScore(player, "Lvl");
      const prev = lastLevels.get(player.id) || 0;

      if (lvl > prev) {
        // subiu de nível
        mostrarProximoRank(player, lvl);
      }

      lastLevels.set(player.id, lvl);

      promoteRankByLevel(player);
      atualizarNameTag(player);
    } catch (e) {
      console.warn("Erro ao atualizar rank:", e);
    }
  }
}, 100);

function mostrarProximoRank(player, lvl) {
  // thresholds em ordem crescente
  const thresholds = [
    { lvl: 15, tag: "Genin" },
    { lvl: 30, tag: "Chunin" },
    { lvl: 45, tag: "Anbu" },
    { lvl: 55, tag: "Jonin" },
    { lvl: 70, tag: "Kage" }
  ];

  const proximo = thresholds.find(t => lvl < t.lvl);
  if (proximo) {
    const falta = proximo.lvl - lvl;
    player.sendMessage(`§eFaltam §c${falta}§e níveis para o rank §b${proximo.tag}§e (Lv.${proximo.lvl})`);
  }
}

const RANK_OVERRIDE_TAGS = ["VIP","Monarca","Deus"];

function hasRankOverride(player) {
  return hasAnyTag(player, RANK_OVERRIDE_TAGS);
}

function removerRanks(player) {
  for (const r of RANKS) {
    try { player.runCommandAsync(`tag @s remove ${r}`); } catch {}
  }
}

function promoteRankByLevel(player) {
  if (hasRankOverride(player)) return;

  const lvl = getScore(player, "Lvl");
  let karma = getScore(player, "karma");

  // limitar karma
  if (karma > 1000) { setScore(player, "karma", 1000); karma = 1000; }
  if (karma < -500) { setScore(player, "karma", -500); karma = -500; }

  const vilaTag = player.getTags().find(t => VILAS.includes(t));
  let finalTag = null;

  // --- Karma negativo: Akatsuki ---
  if (karma < 0) {
    finalTag = "Akatsuki";
    if (!player.hasTag("Akatsuki")) {
      player.addTag(finalTag);
      player.addTag("chapeuakt");
      player.addTag("mantoakt");
      player.addTag("mascaraobito");
      player.addTag("mascaratobi");
      player.sendMessage("§4━━━━━━━━━━━━━━━━━━━━━━");
      player.sendMessage("§cSeu Karma caiu abaixo de 0!");
      player.sendMessage("§cVocê se tornou Akatsuki e recebeu manto, mascara e chapéu!");
      player.sendMessage("§4━━━━━━━━━━━━━━━━━━━━━━");
    }
  }

  // --- Karma baixo: Renegado ---
  else if (karma <= 325) {
    finalTag = "Renegado";
    if (!player.hasTag("Renegado")) {
      player.addTag(finalTag);
      player.sendMessage("§6━━━━━━━━━━━━━━━━━━━━━━");
      player.sendMessage("§eSeu Karma está baixo...");
      player.sendMessage("§eVocê virou Renegado e recebeu sua bandana renegada!");
      player.sendMessage("§6━━━━━━━━━━━━━━━━━━━━━━");

      // Entrega da bandana renegada e remoção da normal
      if (player.hasTag("Folha")) {
        player.addTag("bankonohare");
        player.removeTag("bankonoha");
      } else if (player.hasTag("Areia")) {
        player.addTag("bansunare");
        player.removeTag("bansuna");
      } else if (player.hasTag("Nevoa")) {
        player.addTag("bannevoare");
        player.removeTag("bannevoa");
      } else if (player.hasTag("Pedra")) {
        player.addTag("banpedrare");
        player.removeTag("banpedra");
      } else if (player.hasTag("Nuvem")) {
        player.addTag("bannuvemre");
        player.removeTag("bannuvem");
      }
    }
  }

  // --- Karma máximo: 1000 ---
  else if (karma === 1000 && !player.hasTag("mantoaktbranco")) {
    player.addTag("mantoaktbranco");
    player.sendMessage("§f━━━━━━━━━━━━━━━━━━━━━━");
    player.sendMessage("§aSeu Karma atingiu 1000!");
    player.sendMessage("§fVocê ganhou o manto branco especial!");
    player.sendMessage("§f━━━━━━━━━━━━━━━━━━━━━━");
    // não altera rank, apenas adiciona o manto
  }

  // --- Promoções por nível ---
  else {
    const thresholds = [
      { lvl: 70, tag: "Kage" },
      { lvl: 55, tag: "Jonin" },
      { lvl: 45, tag: "Anbu" },
      { lvl: 30, tag: "Chunin" },
      { lvl: 15, tag: "Genin" }
    ];

    const desired = thresholds.find(t => lvl >= t.lvl)?.tag;
    if (desired) {
      finalTag = desired;

      // Ajuste para Kage de acordo com a vila
      if (desired === "Kage" && vilaTag) {
        switch (vilaTag) {
          case "Folha": finalTag = "Hokage"; break;
          case "Areia": finalTag = "Kazekage"; break;
          case "Nuvem": finalTag = "Raikage"; break;
          case "Nevoa": finalTag = "Mizukage"; break;
          case "Pedra": finalTag = "Tsuchikage"; break;
        }
      }

      if (!player.hasTag(finalTag)) {
        player.addTag(finalTag);

        // Mensagens e recompensas específicas por rank
        switch (finalTag) {
          case "Genin":
            player.sendMessage("§a━━━━━━━━━━━━━━━━━━━━━━");
            player.sendMessage("§eVocê agora é §aGenin§e!");
            player.sendMessage("§aContinue treinando para evoluir!");
            player.sendMessage("§a━━━━━━━━━━━━━━━━━━━━━━");
            break;

          case "Chunin":
            player.sendMessage("§b━━━━━━━━━━━━━━━━━━━━━━");
            player.sendMessage("§eVocê alcançou o rank §bChunin§e!");
            player.sendMessage("§bSua jornada ninja está avançando!");
            player.sendMessage("§b━━━━━━━━━━━━━━━━━━━━━━");
            break;

          case "Jonin":
            player.sendMessage("§6━━━━━━━━━━━━━━━━━━━━━━");
            player.sendMessage("§eParabéns! Você se tornou §6Jonin§e!");
            player.sendMessage("§bVocê recebeu seu §dColete Jonin§b!");
            player.sendMessage("§6━━━━━━━━━━━━━━━━━━━━━━");
            player.runCommandAsync(`titleraw @s title {"rawtext":[{"text":"§e§lVocê agora é Jonin!"}]}`);

            // Entrega do colete Jonin de acordo com a vila
            if (player.hasTag("Folha")) player.addTag("joninfolha");
            else if (player.hasTag("Areia")) player.addTag("joninareia");
            else if (player.hasTag("Nuvem")) player.addTag("joninnuvem");
            else if (player.hasTag("Nevoa")) player.addTag("joninnevoa");
            else if (player.hasTag("Pedra")) player.addTag("joninpedra");
            break;

          case "Anbu":
            player.sendMessage("§d━━━━━━━━━━━━━━━━━━━━━━");
            player.sendMessage("§eVocê foi promovido a §dAnbu§e!");
            player.sendMessage("§dVocê agora faz parte da elite da vila!");
            player.sendMessage("§d━━━━━━━━━━━━━━━━━━━━━━");
            player.runCommandAsync(`titleraw @s title {"rawtext":[{"text":"§d§lVocê agora é Anbu!"}]}`);
            break;

          case "Hokage":
          case "Kazekage":
          case "Mizukage":
          case "Tsuchikage":
          case "Raikage":
            player.sendMessage("§6§l━━━━━━━━━━━━━━━━━━━━━━");
            player.sendMessage(`§eParabéns! Você alcançou o nível §c${finalTag}§e!`);
            player.sendMessage("§bVocê recebeu seu §dmanto§b e §dchapéu§b de Kage!");
            player.sendMessage("§6§l━━━━━━━━━━━━━━━━━━━━━━");
            player.runCommandAsync(`titleraw @s title {"rawtext":[{"text":"§e§lVocê agora é ${finalTag}!"}]}`);

            switch (finalTag) {
              case "Hokage": player.addTag("mantohokage"); player.addTag("chapeuho"); break;
              case "Kazekage": player.addTag("mantokazekage"); player.addTag("chapeukaze"); break;
              case "Mizukage": player.addTag("mantomizukage"); player.addTag("chapeumizu"); break;
              case "Tsuchikage": player.addTag("mantotsuchikage"); player.addTag("chapeutsuchi"); break;
              case "Raikage": player.addTag("mantoraikage"); player.addTag("chapeurai"); break;
            }
            break;
        }
      }
    }
  }

  // --- Só depois de aplicar o novo rank, remove os antigos ---
  if (finalTag) {
    for (const r of RANKS) {
      if (r !== finalTag) player.removeTag(r);
    }

    // Se não for mais Renegado, devolve a bandana normal e remove a renegada
    if (finalTag !== "Renegado") {
      if (player.hasTag("bankonohare")) {
        player.removeTag("bankonohare");
        player.addTag("bankonoha");
      }
      if (player.hasTag("bansunare")) {
        player.removeTag("bansunare");
        player.addTag("bansuna");
      }
      if (player.hasTag("bannevoare")) {
        player.removeTag("bannevoare");
        player.addTag("bannevoa");
      }
      if (player.hasTag("banpedrare")) {
        player.removeTag("banpedrare");
        player.addTag("banpedra");
      }
      if (player.hasTag("bannuvemre")) {
        player.removeTag("bannuvemre");
        player.addTag("bannuvem");
      }
    }

    atualizarNameTag(player);
  }
}

world.afterEvents.playerSpawn.subscribe(({ player }) => {
  system.runTimeout(() => {
    try {
      if (!player.hasTag("karma_inicializado")) {
        setScore(player, "karma", 500);
        player.addTag("karma_inicializado");
        player.sendMessage("§bSeu Karma inicial foi definido em §e500 §f(Neutro) §b!");
      }

      if (!player.hasTag("ItensIniciaisEntregues")) {
        player.runCommandAsync(`replaceitem entity @s slot.hotbar 8 nz:display_config 1 0 {"minecraft:item_lock":{"mode":"lock_in_slot"}}`);
        player.runCommandAsync(`give @s nz:menu_contrato 1 0 {"minecraft:item_lock":{"mode":"lock_in_inventory"}}`);
        player.addTag("ItensIniciaisEntregues");
        player.sendMessage("§aVocê recebeu seus itens iniciais!");
      }

      const alreadyMenu = player.hasTag(ITEMS.TAG_MENU_ENTREGUE) || player.hasTag(ITEMS.TAGMENUENTREGUE);
      if (!alreadyMenu) {
        player.runCommandAsync(
          `replaceitem entity @s slot.hotbar 8 ${ITEMS.MENU} 1 0 {"minecraft:item_lock":{"mode":"lock_in_slot"}}`
        );
        if (ITEMS.TAG_MENU_ENTREGUE) player.addTag(ITEMS.TAG_MENU_ENTREGUE);
        if (ITEMS.TAGMENUENTREGUE) player.addTag(ITEMS.TAGMENUENTREGUE);
        player.sendMessage("§aMenu inicial entregue!");
      }

      player.sendMessage("§cPARA TRADE COM NPC DE TRADE, BASTA BATER NELES AGACHADO! (RECOMENDO DESATIVAR O MODO)");
      openClanMenu(player);
      atualizarNameTag(player);
    } catch (e) {
      console.warn("Erro ao inicializar jogador:", e);
    }
  }, 10);
});

system.runInterval(() => {
  for (const player of world.getPlayers()) {
    try {
      promoteRankByLevel(player);
      atualizarNameTag(player);
    } catch (e) {
      console.warn("Erro ao atualizar rank:", e);
    }
  }
}, 100);

world.afterEvents.itemUse.subscribe((ev) => {
  const player = ev.source;
  const id = ev.itemStack?.typeId;

  if (!id) return;

  if (id === "nz:display_config1" || id === ITEMS.MENU_CLAN) {
    openStatusMenu(player);
    return;
  }

  if (id === "nz:menu_custom" || id === "nz:display_config" || id === ITEMS.MENU) {
    if (player.hasTag("clan_escolhido")) {
      openStatusMenu(player);
    } else {
      openGeneroMenu(player);
    }
    return;
  }

  if (id === "nz:menu_contrato") {
    const CONTRATO_PERM_TAGS = [
      "Kakuzo","Amado","Pain","Hokage","Mizukage","Kazekage","Tsuchikage","Raikage","VIP","Monarca","Deus"
    ];
    const temPermissao = player.getTags().some(t => CONTRATO_PERM_TAGS.includes(t));
    
    if (!temPermissao) {
      player.sendMessage("§cVocê não tem permissão para abrir contratos.");
    } else {
      player.sendMessage("§aAbrindo menu de contratos...");
    }
    return;
  }
});
