package com.helospark.spark.builder.handlers.codegenerator.component.helper;

import static com.helospark.spark.builder.preferences.PluginPreferenceList.STAGED_BUILDER_ADD_GENERATED_ANNOTATION_ON_STAGE_INTERFACE;

import org.eclipse.jdt.core.dom.AST;
import org.eclipse.jdt.core.dom.MethodDeclaration;
import org.eclipse.jdt.core.dom.SingleMemberAnnotation;
import org.eclipse.jdt.core.dom.StringLiteral;
import org.eclipse.jdt.core.dom.TypeDeclaration;

import com.helospark.spark.builder.preferences.PreferencesManager;
import com.helospark.spark.builder.preferences.StaticPreferences;

/**
 * Adds generated annotation.
 *
 * @author helospark
 */
public class GeneratedAnnotationPopulator {
    private PreferencesManager preferencesManager;

    public GeneratedAnnotationPopulator(PreferencesManager preferencesManager) {
        this.preferencesManager = preferencesManager;
    }

    public void addGeneratedAnnotationOnStagedBuilderInterface(AST ast, TypeDeclaration type) {
        if (preferencesManager.getPreferenceValue(STAGED_BUILDER_ADD_GENERATED_ANNOTATION_ON_STAGE_INTERFACE)) {
            addGeneratedAnnotation(ast, type);
        }
    }

    public void addGeneratedAnnotation(AST ast, TypeDeclaration builderType) {
        SingleMemberAnnotation generatedAnnotation = createGeneratedAnnotation(ast);
        builderType.modifiers().add(0, generatedAnnotation);
    }

    public void addGeneratedAnnotation(AST ast, MethodDeclaration methodDeclaration) {
        SingleMemberAnnotation generatedAnnotation = createGeneratedAnnotation(ast);
        methodDeclaration.modifiers().add(0, generatedAnnotation);
    }

    private SingleMemberAnnotation createGeneratedAnnotation(AST ast) {
        SingleMemberAnnotation generatedAnnotation = ast.newSingleMemberAnnotation();
        generatedAnnotation.setTypeName(ast.newSimpleName("Generated"));
        StringLiteral annotationValue = ast.newStringLiteral();
        annotationValue.setLiteralValue(StaticPreferences.PLUGIN_GENERATED_ANNOTATION_NAME);
        generatedAnnotation.setValue(annotationValue);
        return generatedAnnotation;
    }
}