package org.ei.drishti.dto; import org.apache.commons.lang3.builder.EqualsBuilder; import org.apache.commons.lang3.builder.HashCodeBuilder; import org.apache.commons.lang3.builder.ToStringBuilder; import org.joda.time.DateTime; import java.util.HashMap; import java.util.Map; public class ActionData { private Map<String, String> data; private String target; private String type; private Map<String, String> details; public static ActionData createAlert(BeneficiaryType beneficiaryType, String scheduleName, String visitCode, AlertStatus alertStatus, DateTime startDate, DateTime expiryDate) { return new ActionData("alert", "createAlert") .with("beneficiaryType", beneficiaryType.value()) .with("scheduleName", scheduleName) .with("visitCode", visitCode) .with("alertStatus", alertStatus.value()) .with("startDate", startDate.toLocalDate().toString()) .with("expiryDate", expiryDate.toLocalDate().toString()); } public static ActionData markAlertAsClosed(String visitCode, String completionDate) { return new ActionData("alert", "closeAlert") .with("visitCode", visitCode) .with("completionDate", completionDate); } public static ActionData reportForIndicator(String indicator, String annualTarget, String monthSummaries) { return new ActionData("report", indicator) .with("annualTarget", annualTarget) .with("monthlySummaries", monthSummaries); } public static ActionData closeMother(String reasonForClose) { return new ActionData("mother", "close") .with("reasonForClose", reasonForClose); } public static ActionData from(String actionType, String actionTarget, Map<String, String> data, Map<String, String> details) { ActionData actionData = new ActionData(actionTarget, actionType); actionData.data.putAll(data); actionData.details.putAll(details); return actionData; } private ActionData(String target, String type) { this.target = target; this.type = type; data = new HashMap<String, String>(); details = new HashMap<String, String>(); } private ActionData with(String key, String value) { data.put(key, value); return this; } private ActionData withDetails(Map<String, String> details) { this.details.putAll(details); return this; } public Map<String, String> data() { return data; } public String target() { return target; } public String type() { return type; } public Map<String, String> details() { return details; } @Override public boolean equals(Object o) { return EqualsBuilder.reflectionEquals(this, o); } @Override public int hashCode() { return HashCodeBuilder.reflectionHashCode(this); } @Override public String toString() { return ToStringBuilder.reflectionToString(this); } }