package games.strategy.triplea.delegate;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import games.strategy.engine.data.CompositeChange;
import games.strategy.engine.data.GameData;
import games.strategy.engine.data.PlayerID;
import games.strategy.engine.data.Territory;
import games.strategy.engine.data.Unit;
import games.strategy.engine.delegate.IDelegateBridge;
import games.strategy.triplea.delegate.dataObjects.PlacementDescription;
import games.strategy.triplea.formatter.MyFormatter;
/**
* Contains all the data to describe a placement and to undo it.
*/
class UndoablePlacement extends AbstractUndoableMove {
private static final long serialVersionUID = -1493488646587233451L;
final Territory m_placeTerritory;
Territory m_producerTerritory;
PlayerID m_player;
public UndoablePlacement(final PlayerID player, final CompositeChange change, final Territory producer_territory,
final Territory place_territory, final Collection<Unit> units) {
super(change, units);
m_placeTerritory = place_territory;
m_producerTerritory = producer_territory;
m_player = player;
}
public Territory getProducerTerritory() {
return m_producerTerritory;
}
public void setProducerTerritory(final Territory producerTerritory) {
m_producerTerritory = producerTerritory;
}
public Territory getPlaceTerritory() {
return m_placeTerritory;
}
@Override
protected final void undoSpecific(final IDelegateBridge bridge) {
final GameData data = bridge.getData();
final AbstractPlaceDelegate currentDelegate = (AbstractPlaceDelegate) data.getSequence().getStep().getDelegate();
final Map<Territory, Collection<Unit>> produced = currentDelegate.getProduced();
final Collection<Unit> units = produced.get(m_producerTerritory);
units.removeAll(getUnits());
if (units.isEmpty()) {
produced.remove(m_producerTerritory);
}
currentDelegate.setProduced(new HashMap<>(produced));
}
@Override
public final String getMoveLabel() {
if (m_producerTerritory != m_placeTerritory) {
return m_producerTerritory.getName() + " -> " + m_placeTerritory.getName();
}
return m_placeTerritory.getName();
}
@Override
public final Territory getEnd() {
return m_placeTerritory;
}
@Override
protected final PlacementDescription getDescriptionObject() {
return new PlacementDescription(m_units, m_placeTerritory);
}
@Override
public String toString() {
if (m_producerTerritory != m_placeTerritory) {
return m_producerTerritory.getName() + " produces in " + m_placeTerritory.getName() + ": "
+ MyFormatter.unitsToTextNoOwner(m_units);
}
return m_placeTerritory.getName() + ": " + MyFormatter.unitsToTextNoOwner(m_units);
}
}