package me.corriekay.pokegoutil.data.models.operations;
import java.util.ArrayList;
import java.util.List;
import com.pokegoapi.exceptions.InvalidCurrencyException;
import com.pokegoapi.exceptions.LoginFailedException;
import com.pokegoapi.exceptions.RemoteServerException;
import javafx.collections.ObservableList;
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.ConfigNew;
import me.corriekay.pokegoutil.utils.Utilities;
public abstract class Operation {
public static List<Operation> generateOperations(
final OperationId operationId,
final ObservableList<PokemonModel> pokemonList) {
final List<Operation> operationList = new ArrayList<Operation>();
pokemonList.forEach(model -> {
final Operation operation = generateOperation(operationId, model);
operationList.add(operation);
});
return operationList;
}
public static Operation generateOperation(final OperationId operationId, final PokemonModel model) {
switch (operationId) {
case EVOLVE:
return new EvolveOperation(model);
case FAVORITE:
return new FavoriteOperation(model);
case POWERUP:
return new PowerupOperation(model);
case RENAME:
return new RenameOperation(model);
case TRANSFER:
return new TransferOperation(model);
default:
throw new IllegalArgumentException(
String.format("OperationID <%s> has not been handled!", operationId));
}
}
private Integer delay;
public PokemonModel pokemon;
protected ConfigNew config = ConfigNew.getConfig();
protected Operation() {
// For mocking
}
public Operation(final PokemonModel pokemon) {
this.delay = getRandomDelay();
this.pokemon = pokemon;
}
protected abstract BpmOperationResult doOperation() throws LoginFailedException, RemoteServerException;
public BpmOperationResult execute() throws InvalidCurrencyException, LoginFailedException, RemoteServerException {
BpmOperationResult result = validateOperation();
if (result.isSuccess()) {
result = doOperation();
}
return result;
}
public void doDelay() {
System.out.println("Waiting " + delay.toString() + " ms before next operation");
Utilities.sleep(delay);
}
public Integer getDelay() {
return delay;
}
protected abstract int getMaxDelay();
protected abstract int getMinDelay();
public abstract OperationId getOperationId();
private int getRandomDelay() {
return Utilities.getRandom(getMaxDelay(), getMaxDelay());
}
@Override
public String toString() {
return getOperationId().getActionName() + " " + pokemon.getSummary();
}
public abstract BpmOperationResult validateOperation()
throws InvalidCurrencyException, LoginFailedException, RemoteServerException;
}