package me.corriekay.pokegoutil.data.models.operations;
import com.pokegoapi.api.map.pokemon.EvolutionResult;
import com.pokegoapi.api.pokemon.Pokemon;
import com.pokegoapi.exceptions.CaptchaActiveException;
import com.pokegoapi.exceptions.LoginFailedException;
import com.pokegoapi.exceptions.RemoteServerException;
import com.pokegoapi.exceptions.hash.HashException;
import me.corriekay.pokegoutil.data.enums.OperationError;
import me.corriekay.pokegoutil.data.models.BpmOperationResult;
import me.corriekay.pokegoutil.data.models.PokemonModel;
import me.corriekay.pokegoutil.gui.enums.OperationId;
import me.corriekay.pokegoutil.utils.ConfigKey;
import me.corriekay.pokegoutil.utils.pokemon.PokemonUtils;
public class EvolveOperation extends Operation {
/**
* Instantiate EvolveOperation. Only used in mocking.
*/
protected EvolveOperation() {
// For mocking
super();
}
/**
* Instantiate EvolveOperation with a pokemon.
*
* @param pokemon pokemon to evolve
*/
public EvolveOperation(final PokemonModel pokemon) {
super(pokemon);
}
@Override
protected BpmOperationResult doOperation() throws LoginFailedException, RemoteServerException {
final EvolutionResult evolutionResult;
final String erroEvolvingString = "Error evolving %s, result: %s";
try {
evolutionResult = pokemon.getPokemon().evolve();
} catch (CaptchaActiveException e) {
e.printStackTrace();
return new BpmOperationResult(String.format(
erroEvolvingString,
pokemon.getSpecies(),
"Captcha active in account"),
OperationError.EVOLVE_FAIL);
} catch (HashException e) {
return new BpmOperationResult(String.format(
erroEvolvingString,
pokemon.getSpecies(),
"Error with Hash: " + e.getMessage()),
OperationError.EVOLVE_FAIL);
}
if (!evolutionResult.isSuccessful()) {
return new BpmOperationResult(String.format(
erroEvolvingString,
pokemon.getSpecies(),
evolutionResult.getResult().toString()),
OperationError.EVOLVE_FAIL);
}
final Pokemon poke = pokemon.getPokemon();
final int candies = poke.getCandy();
final int candiesToEvolve = poke.getCandiesToEvolve();
final int cp = poke.getCp();
final int hp = poke.getMaxStamina();
final Pokemon newPoke = evolutionResult.getEvolvedPokemon();
final int newCandies = newPoke.getCandy();
final int newCp = newPoke.getCp();
final int newHp = newPoke.getStamina();
final int candyRefund = 1;
pokemon.setPokemon(newPoke);
final BpmOperationResult result = new BpmOperationResult();
result.addSuccessMessage(String.format(
"Evolving %s. Evolve result: %s",
PokemonUtils.getLocalPokeName(poke),
evolutionResult.getResult().toString()));
result.addSuccessMessage(String.format(
"Stat changes: "
+ "(Candies: %d[%d-%d+%d], "
+ "CP: %d[+%d], "
+ "HP: %d[+%d])",
newCandies, candies, candiesToEvolve, candyRefund,
newCp, (newCp - cp),
newHp, (newHp - hp)));
if (config.getBool(ConfigKey.TRANSFER_AFTER_EVOLVE)){
result.setNextOperation(OperationId.TRANSFER);
}
return result;
}
@Override
protected int getMaxDelay() {
return config.getInt(ConfigKey.DELAY_EVOLVE_MAX);
}
@Override
protected int getMinDelay() {
return config.getInt(ConfigKey.DELAY_EVOLVE_MIN);
}
@Override
public OperationId getOperationId() {
return OperationId.EVOLVE;
}
@Override
public BpmOperationResult validateOperation() {
if (pokemon.isInGym()) {
return new BpmOperationResult("Pokemon is in gym", OperationError.IN_GYM);
}
final int candies = pokemon.getCandies();
final int candiesToEvolve = pokemon.getCandies2Evlv();
if (candiesToEvolve == 0) {
return new BpmOperationResult("Pokemon cannot be evolved", OperationError.NOT_EVOLVABLE);
}
if (candies < candiesToEvolve) {
return new BpmOperationResult(String.format(
"Insufficent candies, needed %d but had %d ",
candiesToEvolve,
candies),
OperationError.INSUFFICENT_CANDIES);
}
return new BpmOperationResult();
}
}