jaghaimo/hypernet

View on GitHub
src/main/java/hypernet/handler/dialog/Cargo.java

Summary

Maintainability
A
1 hr
Test Coverage
package hypernet.handler.dialog;

import java.util.ArrayList;
import java.util.List;

import com.fs.starfarer.api.Global;
import com.fs.starfarer.api.campaign.CargoAPI;
import com.fs.starfarer.api.campaign.CargoPickerListener;
import com.fs.starfarer.api.campaign.CargoStackAPI;
import com.fs.starfarer.api.campaign.econ.SubmarketAPI;
import com.fs.starfarer.api.ui.TooltipMakerAPI;

import hypernet.DialogOption;
import hypernet.DialogPlugin;
import hypernet.IntelProvider;
import hypernet.filter.CargoStackFilter;
import hypernet.filter.MutableFilterManager;
import hypernet.helper.CollectionHelper;
import hypernet.helper.MarketHelper;
import hypernet.provider.CargoIntelProvider;

public class Cargo extends FilterAware implements CargoPickerListener {

    private DialogPlugin plugin;

    public Cargo(DialogOption o, DialogOption p) {
        super(o, p);
    }

    @Override
    public void cancelledCargoSelection() {
        plugin.addText("Query cancelled...");
    }

    @Override
    public void pickedCargo(CargoAPI cargo) {
        if (cargo.isEmpty()) {
            plugin.addText("Query cancelled...");
            return;
        }
        cargo.sort();
        for (CargoStackAPI cargoStack : cargo.getStacksCopy()) {
            IntelProvider provider = new CargoIntelProvider(cargoStack);
            plugin.addText("Adding intel query for " + cargoStack.getDisplayName() + ".");
            plugin.addNewQuery(provider);
        }
        Menu.forceMenu(plugin);
    }

    @Override
    public void recreateTextPanel(TooltipMakerAPI panel, CargoAPI cargo, CargoStackAPI pickedUp,
            boolean pickedUpFromSource, CargoAPI combined) {
    }

    @Override
    protected DialogOption run(DialogPlugin plugin) {
        this.plugin = plugin;
        MutableFilterManager filterManager = plugin.getFilterManager();
        CargoAPI cargo = getCargo(filterManager);

        if (cargo.isEmpty()) {
            String category = filterManager.getCargoType().getName().substring(7).toLowerCase();
            plugin.addText("No markets selling " + category + " found.");
            return option;
        }

        plugin.getDialog().showCargoPickerDialog("Pick items to query for...", "Query", "Cancel", false, 0f, cargo,
                this);
        return option;
    }

    private CargoAPI getCargo(MutableFilterManager filterManager) {
        List<CargoStackAPI> cargoStacks = findItems(filterManager);
        return makeCargoFromStacks(cargoStacks);
    }

    private List<CargoStackAPI> findItems(MutableFilterManager filterManager) {
        List<SubmarketAPI> submarkets = MarketHelper.getSubmarkets();
        List<CargoStackFilter> cargoStackFilters = filterManager.listCargoFilters();
        List<CargoStackAPI> cargoStacks = new ArrayList<CargoStackAPI>();

        for (SubmarketAPI s : submarkets) {
            List<CargoStackAPI> submarketStacks = s.getCargo().getStacksCopy();
            CollectionHelper.reduce(submarketStacks, cargoStackFilters);
            cargoStacks.addAll(submarketStacks);
        }

        return cargoStacks;
    }

    private CargoAPI makeCargoFromStacks(List<CargoStackAPI> cargoStacks) {
        CargoAPI cargo = Global.getFactory().createCargo(true);
        for (CargoStackAPI cargoStack : cargoStacks) {
            cargo.addFromStack(cargoStack);
        }
        cargo.sort();
        return cargo;
    }
}