package org.ei.drishti.domain; import org.apache.commons.lang3.builder.EqualsBuilder; import org.apache.commons.lang3.builder.HashCodeBuilder; import org.apache.commons.lang3.builder.ToStringBuilder; import org.codehaus.jackson.annotate.JsonProperty; import org.ei.drishti.common.util.DateUtil; import org.ei.drishti.common.util.IntegerUtil; import org.ei.drishti.domain.register.*; import org.ektorp.support.TypeDiscriminator; import org.motechproject.model.MotechBaseDataObject; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import static org.ei.drishti.common.AllConstants.ECRegistrationFields.WIFE_AGE; import static org.ei.drishti.common.AllConstants.ECRegistrationFields.WIFE_DOB; import static org.ei.drishti.common.AllConstants.FamilyPlanningFormFields.CURRENT_FP_METHOD_FIELD_NAME; @TypeDiscriminator("doc.type === 'EligibleCouple'") public class EligibleCouple extends MotechBaseDataObject { @JsonProperty private String caseId; @JsonProperty private String ecNumber; @JsonProperty private String wifeName; @JsonProperty private String husbandName; @JsonProperty private String anmIdentifier; @JsonProperty private String village; @JsonProperty private String subCenter; @JsonProperty private String phc; @JsonProperty private String isOutOfArea; @JsonProperty private String isClosed; @JsonProperty private Map<String, String> details; @JsonProperty private List<IUDFPDetails> iudFPDetails; @JsonProperty private List<CondomFPDetails> condomFPDetails; @JsonProperty private List<OCPFPDetails> ocpFPDetails; @JsonProperty private List<MaleSterilizationFPDetails> maleSterilizationFPDetails; @JsonProperty private List<FemaleSterilizationFPDetails> femaleSterilizationFPDetails; public EligibleCouple() { } public EligibleCouple(String caseId, String ecNumber) { this.caseId = caseId; this.ecNumber = ecNumber; this.isOutOfArea = "false"; this.setIsClosed(false); } public EligibleCouple withCouple(String wifeName, String husbandName) { this.wifeName = wifeName; this.husbandName = husbandName; return this; } public EligibleCouple withANMIdentifier(String anmIdentifier) { this.anmIdentifier = anmIdentifier; return this; } public EligibleCouple withLocation(String village, String subCenter, String phc) { this.village = village; this.subCenter = subCenter; this.phc = phc; return this; } public EligibleCouple withDetails(Map<String, String> details) { this.details = new HashMap<>(details); return this; } public EligibleCouple withIUDFPDetails(List<IUDFPDetails> iudfpDetails) { this.iudFPDetails = iudfpDetails; return this; } public EligibleCouple withCondomFPDetails(List<CondomFPDetails> condomFPDetails) { this.condomFPDetails = condomFPDetails; return this; } public EligibleCouple withOCPFPDetails(List<OCPFPDetails> ocpfpDetails) { this.ocpFPDetails = ocpfpDetails; return this; } public EligibleCouple withMaleSterilizationFPDetails(List<MaleSterilizationFPDetails> maleSterilizationFPDetails) { this.maleSterilizationFPDetails = maleSterilizationFPDetails; return this; } public EligibleCouple withFemaleSterilizationFPDetails(List<FemaleSterilizationFPDetails> femaleSterilizationFPDetails) { this.femaleSterilizationFPDetails = femaleSterilizationFPDetails; return this; } public EligibleCouple asOutOfArea() { this.isOutOfArea = "true"; return this; } public String wifeName() { return wifeName; } public String husbandName() { return husbandName; } public String caseId() { return caseId; } public String ecNumber() { return ecNumber; } public String village() { return village; } public String subCenter() { return subCenter; } public String phc() { return phc; } public Location location() { return new Location(village, subCenter, phc); } public String anmIdentifier() { return anmIdentifier; } public Map<String, String> details() { return details; } public EligibleCouple setIsClosed(boolean isClosed) { this.isClosed = Boolean.toString(isClosed); return this; } public String currentMethod() { return details.get(CURRENT_FP_METHOD_FIELD_NAME); } private String getCaseId() { return caseId; } public String getDetail(String name) { return details.get(name); } public List<IUDFPDetails> iudFPDetails() { if (this.iudFPDetails == null) this.iudFPDetails = new ArrayList<>(); return iudFPDetails; } public List<CondomFPDetails> condomFPDetails() { if (this.condomFPDetails == null) this.condomFPDetails = new ArrayList<>(); return condomFPDetails; } public List<OCPFPDetails> ocpFPDetails() { if (this.ocpFPDetails == null) this.ocpFPDetails = new ArrayList<>(); return ocpFPDetails; } public List<MaleSterilizationFPDetails> maleSterilizationFPDetails() { if (this.maleSterilizationFPDetails == null) this.maleSterilizationFPDetails = new ArrayList<>(); return maleSterilizationFPDetails; } public List<FemaleSterilizationFPDetails> femaleSterilizationFPDetails() { if (this.femaleSterilizationFPDetails == null) this.femaleSterilizationFPDetails = new ArrayList<>(); return femaleSterilizationFPDetails; } @Override public boolean equals(Object o) { return EqualsBuilder.reflectionEquals(this, o, "id", "revision"); } @Override public int hashCode() { return HashCodeBuilder.reflectionHashCode(this, "id", "revision"); } @Override public String toString() { return ToStringBuilder.reflectionToString(this); } public String wifeDOB() { String wifeDOB = details.get(WIFE_DOB); if (wifeDOB != null) { return wifeDOB; } int wifeAge = IntegerUtil.tryParse(details.get(WIFE_AGE), 0); return String.valueOf((wifeAge != 0) ? DateUtil.today().minusYears(wifeAge) : null); } }