package mekhq.service;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import megamek.common.TargetRoll;
import mekhq.campaign.Campaign;
import mekhq.campaign.parts.Part;
import mekhq.campaign.personnel.Person;
import mekhq.campaign.unit.Unit;
import mekhq.campaign.work.IAcquisitionWork;
public class PartsAcquisitionService {
private static Map<String, List<IAcquisitionWork>> acquisitionMap = null;
private static Map<String, PartCountInfo> partCountInfoMap = new HashMap<String, PartCountInfo>();
private static int inTransitCount = 0;
private static int onOrderCount = 0;
private static int omniPodCount = 0;
private static int missingCount = 0;
private static int requiredCount = 0;
private static int unavailableCount = 0;
private static long missingTotalPrice = 0;
private PartsAcquisitionService() {
}
public static Map<String, List<IAcquisitionWork>> getAcquisitionMap() {
return acquisitionMap;
}
public static void setAcquisitionMap(Map<String, List<IAcquisitionWork>> acquisitionMap) {
PartsAcquisitionService.acquisitionMap = acquisitionMap;
}
public static Map<String, PartCountInfo> getPartCountInfoMap() {
return partCountInfoMap;
}
public static void setPartCountInfoMap(Map<String, PartCountInfo> partCountInfoMap) {
PartsAcquisitionService.partCountInfoMap = partCountInfoMap;
}
public static int getInTransitCount() {
return inTransitCount;
}
public static void setInTransitCount(int inTransitCount) {
PartsAcquisitionService.inTransitCount = inTransitCount;
}
public static int getOnOrderCount() {
return onOrderCount;
}
public static void setOnOrderCount(int onOrderCount) {
PartsAcquisitionService.onOrderCount = onOrderCount;
}
public static int getOmniPodCount() {
return omniPodCount;
}
public static void setOmniPodCount(int omniPodCount) {
PartsAcquisitionService.omniPodCount = omniPodCount;
}
public static int getMissingCount() {
return missingCount;
}
public static void setMissingCount(int missingCount) {
PartsAcquisitionService.missingCount = missingCount;
}
public static int getRequiredCount() {
return requiredCount;
}
public static void setRequiredCount(int requiredCount) {
PartsAcquisitionService.requiredCount = requiredCount;
}
public static int getUnavailableCount() {
return unavailableCount;
}
public static void setUnavailableCount(int unavailableCount) {
PartsAcquisitionService.unavailableCount = unavailableCount;
}
public static long getMissingTotalPrice() {
return missingTotalPrice;
}
public static void setMissingTotalPrice(long missingTotalPrice) {
PartsAcquisitionService.missingTotalPrice = missingTotalPrice;
}
public static void buildPartsList(Campaign campaign) {
acquisitionMap = new HashMap<String, List<IAcquisitionWork>>();
List<Unit> unitList = campaign.getServiceableUnits();
for (Unit unit : unitList) {
ArrayList<IAcquisitionWork> unitPartsList = campaign.getAcquisitionsForUnit(unit.getId());
for (IAcquisitionWork aw : unitPartsList) {
if (null == aw.getAcquisitionPart()) {
continue;
}
List<IAcquisitionWork> awList = acquisitionMap.get(aw.getAcquisitionDisplayName());
if (null == awList) {
awList = new ArrayList<IAcquisitionWork>();
acquisitionMap.put(aw.getAcquisitionDisplayName(), awList);
}
awList.add(aw);
}
}
generateSummaryCounts(campaign);
}
public static void generateSummaryCounts(Campaign campaign) {
partCountInfoMap = new HashMap<String, PartCountInfo>();
Person admin = campaign.getLogisticsPerson();
for (List<IAcquisitionWork> awList : acquisitionMap.values()) {
IAcquisitionWork awFirst = awList.get(0);
Part part = awFirst.getAcquisitionPart();
TargetRoll target = campaign.getTargetForAcquisition(awFirst, admin);
PartCountInfo pci = new PartCountInfo();
int[] inventories = getInventories(part, campaign, pci);
int inTransit = inventories[1];
int onOrder = inventories[2];
int omniPod = 0;
if (!part.isOmniPodded()) {
part.setOmniPodded(true);
inventories = getInventories(part, campaign, pci);
if (inventories[0] > 0) {
omniPod = inventories[0];
}
part.setOmniPodded(false);
}
int missing = Math.max(0, awList.size() - inTransit - onOrder);
pci.setKey(awFirst.getAcquisitionDisplayName());
pci.setRequiredCount(awList.size());
pci.setStickerPrice(part.getStickerPrice());
pci.setMissingCount(missing);
if (target.getValue() == TargetRoll.IMPOSSIBLE) {
pci.setCanBeAcquired(false);
pci.setFailedMessage(target.getPlainDesc());
} else {
pci.setInTransitCount(inTransit);
pci.setOnOrderCount(onOrder);
pci.setOmniPodCount(omniPod);
}
partCountInfoMap.put(awList.get(0).getAcquisitionDisplayName(), pci);
}
inTransitCount = 0;
onOrderCount = 0;
omniPodCount = 0;
missingCount = 0;
requiredCount = 0;
unavailableCount = 0;
missingTotalPrice = 0;
//campaign.addReport("***START: generateSummaryCounts");
for (PartCountInfo pci : partCountInfoMap.values()) {
inTransitCount += pci.getInTransitCount();
onOrderCount += pci.getOnOrderCount();
missingCount += pci.getMissingCount();
requiredCount += pci.getRequiredCount();
omniPodCount += pci.getOmniPodCount();
if (pci.getMissingCount() > 0) {
if (!pci.isCanBeAcquired()) {
unavailableCount += pci.getMissingCount();
} else {
missingTotalPrice += (pci.getMissingCount() * pci.getStickerPrice());
}
}
//campaign.addReport(pci.toString());
}
//campaign.addReport("***END: generateSummaryCounts");
}
private static int[] getInventories(Part part, Campaign campaign, PartCountInfo pci) {
String[] inventories = campaign.getPartInventory(part);
int[] parsedInventories = new int[inventories.length];
int idx = 0;
for (String s : inventories) {
if (s.indexOf(" ") > -1) {
parsedInventories[idx] = Integer.parseInt(s.substring(0, s.indexOf(" ")));
pci.setCountModifier(s.substring(s.indexOf(" ") + 1));
} else {
parsedInventories[idx] = Integer.parseInt(s);
}
idx++;
}
return parsedInventories;
}
public static class PartCountInfo {
private String key;
private int requiredCount;
private int missingCount;
private int inTransitCount;
private int onOrderCount;
private String countModifier = "";
private int omniPodCount;
private long stickerPrice;
private String failedMessage;
private boolean canBeAcquired = true;
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public int getRequiredCount() {
return requiredCount;
}
public void setRequiredCount(int requiredCount) {
this.requiredCount = requiredCount;
}
public int getMissingCount() {
return missingCount;
}
public void setMissingCount(int missingCount) {
this.missingCount = missingCount;
}
public int getInTransitCount() {
return inTransitCount;
}
public void setInTransitCount(int inTransitCount) {
this.inTransitCount = inTransitCount;
}
public int getOnOrderCount() {
return onOrderCount;
}
public void setOnOrderCount(int onOrderCount) {
this.onOrderCount = onOrderCount;
}
public int getOmniPodCount() {
return omniPodCount;
}
public void setOmniPodCount(int omniPodCount) {
this.omniPodCount = omniPodCount;
}
public String getCountModifier() {
return countModifier;
}
public void setCountModifier(String countModifier) {
this.countModifier = countModifier;
}
public long getStickerPrice() {
return stickerPrice;
}
public void setStickerPrice(long stickerPrice) {
this.stickerPrice = stickerPrice;
}
public String getFailedMessage() {
return failedMessage;
}
public void setFailedMessage(String failedMessage) {
this.failedMessage = failedMessage;
}
public boolean isCanBeAcquired() {
return canBeAcquired;
}
public void setCanBeAcquired(boolean canBeAcquired) {
this.canBeAcquired = canBeAcquired;
}
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append(key);
sb.append("{");
sb.append("requiredCount=" + requiredCount);
sb.append(",missingCount=" + missingCount);
sb.append(",inTransitCount=" + inTransitCount);
sb.append(",onOrderCount=" + onOrderCount);
sb.append(",omniPodCount=" + omniPodCount);
sb.append(",countModifier='" + countModifier + "'");
sb.append(",stickerPrice=" + stickerPrice);
sb.append(",failedMessage='" + failedMessage + "'");
sb.append(",canBeAcquired=" + canBeAcquired);
sb.append("}");
return sb.toString();
}
}
}