package org.activityinfo.legacy.shared.adapter;
import com.google.common.base.Strings;
import com.google.common.collect.Lists;
import org.activityinfo.model.legacy.CuidAdapter;
import org.activityinfo.model.resource.ResourceId;
import org.activityinfo.i18n.shared.I18N;
import org.activityinfo.legacy.shared.model.*;
import org.activityinfo.model.form.FormClass;
import org.activityinfo.model.form.*;
import org.activityinfo.model.type.NarrativeType;
import org.activityinfo.model.type.ReferenceType;
import org.activityinfo.model.type.time.LocalDateType;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import static org.activityinfo.model.legacy.CuidAdapter.activityCategoryFolderId;
/**
* Adapts a Legacy "Activity" model to a FormClass
*/
public class ActivityFormClassBuilder {
private final ActivityFormDTO activity;
private FormClass siteForm;
public ActivityFormClassBuilder(ActivityFormDTO activity) {
assert activity != null;
this.activity = activity;
}
public FormClass build() {
ResourceId classId = CuidAdapter.activityFormClass(activity.getId());
siteForm = new FormClass(classId);
siteForm.setLabel(activity.getName());
if (!Strings.isNullOrEmpty(activity.getCategory())) {
siteForm.setParentId(activityCategoryFolderId(activity.getDatabaseId(), activity.getCategory()));
} else {
siteForm.setParentId(CuidAdapter.databaseId(activity.getDatabaseId()));
}
FormField partnerField = new FormField(CuidAdapter.field(classId, CuidAdapter.PARTNER_FIELD))
.setLabel(I18N.CONSTANTS.partner())
.setType(ReferenceType.single(CuidAdapter.partnerFormClass(activity.getDatabaseId())))
.setVisible(activity.isEditAllAllowed() && activity.getPartnerRange().size() > 1)
.setRequired(true);
siteForm.addElement(partnerField);
FormField projectField = new FormField(CuidAdapter.field(classId, CuidAdapter.PROJECT_FIELD))
.setLabel(I18N.CONSTANTS.project())
.setType(ReferenceType.single(CuidAdapter.projectFormClass(activity.getDatabaseId())))
.setVisible(activity.getProjects().size() > 0);
siteForm.addElement(projectField);
FormField startDateField = new FormField(CuidAdapter.field(classId, CuidAdapter.START_DATE_FIELD))
.setLabel(I18N.CONSTANTS.startDate())
.setType(LocalDateType.INSTANCE)
.setRequired(true);
siteForm.addElement(startDateField);
FormField endDateField = new FormField(CuidAdapter.field(classId, CuidAdapter.END_DATE_FIELD))
.setLabel(I18N.CONSTANTS.endDate())
.setType(LocalDateType.INSTANCE)
.setRequired(true);
siteForm.addElement(endDateField);
if(!activity.getLocationType().isNationwide()) {
FormField locationField = new FormField(CuidAdapter.locationField(activity.getId()))
.setLabel(activity.getLocationType().getName())
.setType(ReferenceType.single(locationClass(activity.getLocationType())))
.setRequired(true);
siteForm.addElement(locationField);
}
List<IsFormField> fields = Lists.newArrayList();
fields.addAll(activity.getAttributeGroups());
fields.addAll(activity.getIndicators());
Collections.sort(fields, new Comparator<IsFormField>() {
@Override
public int compare(IsFormField o1, IsFormField o2) {
return o1.getSortOrder() - o2.getSortOrder();
}
});
for(IsFormField field : fields) {
siteForm.addElement(field.asFormField());
}
FormField commentsField = new FormField(CuidAdapter.commentsField(activity.getId()));
commentsField.setType(NarrativeType.INSTANCE);
commentsField.setLabel(I18N.CONSTANTS.comments());
siteForm.addElement(commentsField);
return siteForm;
}
private static ResourceId locationClass(LocationTypeDTO locationType) {
if (locationType.isAdminLevel()) {
return CuidAdapter.adminLevelFormClass(locationType.getBoundAdminLevelId());
} else {
return CuidAdapter.locationFormClass(locationType.getId());
}
}
}