package dekk.pw.pokemate.tasks;
import com.pokegoapi.api.map.pokemon.EvolutionResult;
import com.pokegoapi.api.pokemon.Pokemon;
import com.pokegoapi.exceptions.LoginFailedException;
import com.pokegoapi.exceptions.RemoteServerException;
import dekk.pw.pokemate.Config;
import dekk.pw.pokemate.Context;
import dekk.pw.pokemate.PokeMateUI;
import dekk.pw.pokemate.util.StringConverter;
import dekk.pw.pokemate.util.Time;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.io.DataInputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
/**
* Created by TimD on 7/22/2016.
*/
class EvolvePokemon extends Task implements Runnable {
private static final Logger logger = LogManager.getLogger(EvolvePokemon.class);
private static final ConcurrentHashMap<Integer, Integer> CANDY_AMOUNTS = new ConcurrentHashMap<>();
static {
try {
//We will read in from the compacted file...
ClassLoader classloader = Thread.currentThread().getContextClassLoader();
DataInputStream dis = new DataInputStream(classloader.getResourceAsStream("evolve.dat"));
int count = dis.readInt();
for (int i = 0; i < count; i++) {
CANDY_AMOUNTS.put(dis.readInt(), dis.readInt());
}
} catch (Exception e) {
logger.debug("Error", e);
}
}
EvolvePokemon(final Context context) {
super(context);
}
@Override
public void run() {
try {
CopyOnWriteArrayList<Pokemon> pokeList = new CopyOnWriteArrayList<>(context.getInventories().getPokebank().getPokemons());
for (Pokemon pokemon : pokeList)
if (!Config.isWhitelistEnabled() || Config.getWhitelistedPokemon().contains(pokemon.getPokemonId())) {
int number = pokemon.getPokemonId().getNumber();
if (CANDY_AMOUNTS.containsKey(number)) {
int required = CANDY_AMOUNTS.get(number);
if (required < 1) continue;
if (pokemon.getCandy() >= required) {
EvolutionResult result = pokemon.evolve();
if (result != null && result.isSuccessful()) {
String evolutionresult = StringConverter.titleCase(pokemon.getPokemonId().name()) + " has evolved into " + StringConverter.titleCase(result.getEvolvedPokemon().getPokemonId().name()) + " costing " + required + " candies. (+" + result.getCandyAwarded() + (result.getCandyAwarded() > 1 ? " candies " : "candy") + " , " + result.getExpAwarded() + "xp)";
PokeMateUI.toast(evolutionresult, Config.POKE + "mon evolved!", "icons/" + pokemon.getPokemonId().getNumber() + ".png");
context.setConsoleString("EvolvePokemon", evolutionresult);
}
}
}
}
} catch (LoginFailedException e) {
logger.error("Login Failed", e);
} catch (RemoteServerException e) {
context.setConsoleString("CatchPokemon", "Server Error.");
logger.debug("Remote Server Exception", e);
} finally {
context.addTask(new EvolvePokemon(context));
}
}
}