const pokemon = require("./pokemon.json");
const fs = require("fs");

function getPokemonId(name) {
  for (let i = 0; i < pokemon.length; i++) {
    if (pokemon[i].name === name) return i + 1;
  }
  return null;
}

const downloadData = async () => {
  const moves = JSON.parse(fs.readFileSync("moves.json"));

  for (let i = 0; i < moves.length; i++) {
    const output = JSON.parse(fs.readFileSync("data.json"));

    if (output[moves[i].name]) {
      console.log(`Already downloaded ${moves[i].name}`);
      continue;
    }

    const moveId = moves[i].name;
    const response = await fetch(moves[i].url);
    const data = await response.json();

    const learnedBy = [];

    for (let j = 0; j < data.learned_by_pokemon.length; j++) {
      const pokemonId = getPokemonId(data.learned_by_pokemon[j].name);
      if (!pokemonId) continue;
      learnedBy.push(pokemonId);
    }

    const effect = data.effect_entries[0]
      ? data.effect_entries[0].short_effect
      : "";

    const meta = data.meta
      ? {
          ailment: data.meta.ailment.name,
          ailmentChance: data.meta.ailment_chance,
          category: data.meta.category.name,
          critRate: data.meta.crit_rate,
          drain: data.meta.drain,
          flinchChance: data.meta.flinch_chance,
          healing: data.meta.healing,
          maxHits: data.meta.max_hits,
          maxTurns: data.meta.max_turns,
          minHits: data.meta.min_hits,
          minTurns: data.meta.min_turns,
          statChance: data.meta.stat_chance,
        }
      : null;

    const output_ = {
      id: moveId,
      accuracy: data.accuracy,
      damageClass: data.damage_class.name,
      effect,
      effectChance: data.effect_chance,
      learnedBy,
      meta,
      name: data.names.find((name) => name.language.name === "en").name,
      power: data.power,
      pp: data.pp,
      priority: data.priority,
      type: data.type.name,
    };

    output[moveId] = output_;

    console.log(`Downloaded ${output_.name}`);

    fs.writeFileSync("data.json", JSON.stringify(output));

    // wait one second
    await new Promise((resolve) => setTimeout(resolve, 1000));
  }
};

downloadData();