package games.strategy.triplea.ui;
import java.awt.Image;
import java.util.HashSet;
import java.util.Map.Entry;
import java.util.Optional;
import java.util.Set;
import javax.swing.JFrame;
import games.strategy.engine.data.GameData;
import games.strategy.engine.data.NamedAttachable;
import games.strategy.engine.data.PlayerID;
import games.strategy.engine.data.ProductionRule;
import games.strategy.engine.data.Resource;
import games.strategy.engine.data.Territory;
import games.strategy.engine.data.Unit;
import games.strategy.engine.data.UnitType;
import games.strategy.triplea.Constants;
import games.strategy.triplea.image.UnitImageFactory;
import games.strategy.util.IntegerMap;
public class EditProductionPanel extends ProductionPanel {
private static final long serialVersionUID = 5826523459539469173L;
public static IntegerMap<ProductionRule> getProduction(final PlayerID id, final JFrame parent, final GameData data,
final IUIContext uiContext) {
return new EditProductionPanel(uiContext).show(id, parent, data, false, new IntegerMap<>());
}
/** Creates new EditProductionPanel. */
private EditProductionPanel(final IUIContext uiContext) {
super(uiContext);
}
@Override
protected void calculateLimits() {
for (final Rule current : getRules()) {
current.setMax(99);
}
}
@Override
protected void initRules(final PlayerID player, final GameData data,
final IntegerMap<ProductionRule> initialPurchase) {
m_data.acquireReadLock();
try {
m_id = player;
final Set<UnitType> unitsAllowed = new HashSet<>();
if (player.getProductionFrontier() != null) {
for (final ProductionRule productionRule : player.getProductionFrontier()) {
final Rule rule = new Rule(productionRule, player);
for (final Entry<NamedAttachable, Integer> entry : productionRule.getResults().entrySet()) {
if (UnitType.class.isAssignableFrom(entry.getKey().getClass())) {
unitsAllowed.add((UnitType) entry.getKey());
}
}
final int initialQuantity = initialPurchase.getInt(productionRule);
rule.setQuantity(initialQuantity);
m_rules.add(rule);
}
}
// this next part is purely to allow people to "add" neutral (null player) units to territories.
// This is because the null player does not have a production frontier, and we also do not know what units we have
// art for, so only
// use the units on a map.
for (final Territory t : data.getMap()) {
for (final Unit u : t.getUnits()) {
if (u.getOwner().equals(player)) {
final UnitType ut = u.getType();
if (!unitsAllowed.contains(ut)) {
unitsAllowed.add(ut);
final IntegerMap<NamedAttachable> result = new IntegerMap<>();
result.add(ut, 1);
final IntegerMap<Resource> cost = new IntegerMap<>();
cost.add(data.getResourceList().getResource(Constants.PUS), 1);
final ProductionRule newRule = new ProductionRule(ut.getName(), data, result, cost);
final Rule rule = new Rule(newRule, player);
rule.setQuantity(0);
m_rules.add(rule);
}
}
}
}
// now check if we have the art for anything that is left
for (final UnitType ut : data.getUnitTypeList().getAllUnitTypes()) {
if (!unitsAllowed.contains(ut)) {
try {
final UnitImageFactory imageFactory = m_uiContext.getUnitImageFactory();
if (imageFactory != null) {
final Optional<Image> unitImage = imageFactory.getImage(ut, player, data, false, false);
if (unitImage.isPresent()) {
unitsAllowed.add(ut);
final IntegerMap<NamedAttachable> result = new IntegerMap<>();
result.add(ut, 1);
final IntegerMap<Resource> cost = new IntegerMap<>();
cost.add(data.getResourceList().getResource(Constants.PUS), 1);
final ProductionRule newRule = new ProductionRule(ut.getName(), data, result, cost);
final Rule rule = new Rule(newRule, player);
rule.setQuantity(0);
m_rules.add(rule);
}
}
} catch (final Exception e) { // ignore
}
}
}
} finally {
m_data.releaseReadLock();
}
}
}