package org.activityinfo.legacy.shared.adapter;
import com.google.common.base.Function;
import org.activityinfo.core.shared.application.ApplicationProperties;
import org.activityinfo.i18n.shared.I18N;
import org.activityinfo.legacy.shared.model.AdminLevelDTO;
import org.activityinfo.legacy.shared.model.SchemaDTO;
import org.activityinfo.model.form.FormClass;
import org.activityinfo.model.form.FormField;
import org.activityinfo.model.legacy.CuidAdapter;
import org.activityinfo.model.resource.ResourceId;
import org.activityinfo.model.type.ReferenceType;
import org.activityinfo.model.type.primitive.TextType;
import static org.activityinfo.model.legacy.CuidAdapter.adminLevelFormClass;
/**
* Extracts a given AdminLevel from a provided SchemaDTO and converts it to a FormClass
*/
public class AdminLevelClassAdapter implements Function<SchemaDTO, FormClass> {
private final int adminLevelId;
public AdminLevelClassAdapter(int adminLevelId) {
this.adminLevelId = adminLevelId;
}
public static ResourceId getNameFieldId(ResourceId classId) {
return CuidAdapter.field(classId, CuidAdapter.NAME_FIELD);
}
@Override
public FormClass apply(SchemaDTO schema) {
AdminLevelDTO adminLevel = schema.getAdminLevelById(adminLevelId);
ResourceId classId = adminLevelFormClass(adminLevelId);
FormClass formClass = new FormClass(classId);
formClass.setLabel(adminLevel.getName());
if (adminLevel.isRoot()) {
// TODO add country field
} else {
AdminLevelDTO parentLevel = schema.getAdminLevelById(adminLevel.getParentLevelId());
FormField parentField = new FormField(CuidAdapter.field(classId, CuidAdapter.ADMIN_PARENT_FIELD))
.setLabel(parentLevel.getName())
.setSuperProperty(ApplicationProperties.PARENT_PROPERTY)
.setType(ReferenceType.single(adminLevelFormClass(adminLevel.getParentLevelId())))
.setRequired(true);
formClass.addElement(parentField);
}
FormField nameField = new FormField(getNameFieldId(classId));
nameField.setLabel(I18N.CONSTANTS.name());
nameField.setType(TextType.INSTANCE);
nameField.setSuperProperty(ApplicationProperties.LABEL_PROPERTY);
nameField.setRequired(true);
formClass.addElement(nameField);
// Not currently exposed by the legacy api
// FormField codeField = new FormField(CuidAdapter.field(classId, CuidAdapter.CODE_FIELD));
// codeField.setLabel(new LocalizedString(I18N.CONSTANTS.codeFieldLabel()));
// codeField.setType(FormFieldType.FREE_TEXT);
// formClass.addElement(codeField);
return formClass;
}
}