package com.github.florent37.rxandroidorm.generator;
import com.squareup.javapoet.MethodSpec;
import com.squareup.javapoet.TypeName;
import com.squareup.javapoet.TypeSpec;
import java.util.List;
import javax.lang.model.element.Element;
import javax.lang.model.element.Modifier;
import javax.lang.model.element.VariableElement;
import com.github.florent37.rxandroidorm.Constants;
import com.github.florent37.rxandroidorm.ProcessUtils;
/**
* Created by florentchampigny on 22/01/2016.
*/
public class EnumColumnGenerator {
Element element;
List<VariableElement> fields;
public EnumColumnGenerator(Element element) {
this.element = element;
this.fields = ProcessUtils.getFields(element);
}
public TypeSpec generate() {
TypeSpec.Builder enumBuilder = TypeSpec.enumBuilder(ProcessUtils.getObjectName(element) + Constants.ENUM_COLUMN_SUFFIX)
.addModifiers(Modifier.PUBLIC)
.addField(String.class, Constants.ENUM_COLUMN_ELEMENT_NAME, Modifier.PRIVATE, Modifier.FINAL)
.addField(TypeName.BOOLEAN, Constants.ENUM_COLUMN_IS_PRIMITIVE, Modifier.PRIVATE, Modifier.FINAL)
.addMethod(MethodSpec.methodBuilder("getName")
.addModifiers(Modifier.PUBLIC)
.returns(TypeName.get(String.class))
.addStatement("return this.$L", Constants.ENUM_COLUMN_ELEMENT_NAME)
.build())
.addMethod(MethodSpec.methodBuilder("isPrimitive")
.addModifiers(Modifier.PUBLIC)
.returns(TypeName.BOOLEAN)
.addStatement("return this.$L", Constants.ENUM_COLUMN_IS_PRIMITIVE)
.build())
.addMethod(MethodSpec.constructorBuilder()
.addParameter(String.class, "name")
.addParameter(TypeName.BOOLEAN, "primitive")
.addStatement("this.$L = name", Constants.ENUM_COLUMN_ELEMENT_NAME)
.addStatement("this.$L = primitive", Constants.ENUM_COLUMN_IS_PRIMITIVE)
.build());
for (VariableElement variableElement : fields) {
String fieldSqlName = ProcessUtils.getObjectName(variableElement);
if (ProcessUtils.isIdField(variableElement))
fieldSqlName = Constants.FIELD_ID;
boolean isPrimivive = ProcessUtils.isPrimitive(variableElement);
enumBuilder.addEnumConstant(ProcessUtils.getObjectName(variableElement), TypeSpec.anonymousClassBuilder("$S, $L", fieldSqlName, isPrimivive)
.build());
}
return enumBuilder.build();
}
}