package graphql.execution.directives;

import graphql.GraphQLContext;
import graphql.Internal;
import graphql.execution.CoercedVariables;
import graphql.execution.MergedField;
import graphql.execution.NormalizedVariables;
import graphql.language.Field;
import graphql.schema.GraphQLSchema;

import java.util.Locale;
import java.util.function.Supplier;

@Internal
public class QueryDirectivesBuilder implements QueryDirectives.Builder {

    private MergedField mergedField;
    private GraphQLSchema schema;
    private CoercedVariables coercedVariables = CoercedVariables.emptyVariables();
    private Supplier<NormalizedVariables> normalizedVariables = NormalizedVariables::emptyVariables;
    private GraphQLContext graphQLContext = GraphQLContext.getDefault();
    private Locale locale = Locale.getDefault();

    @Override
    public QueryDirectives.Builder schema(GraphQLSchema schema) {
        this.schema = schema;
        return this;
    }

    @Override
    public QueryDirectives.Builder mergedField(MergedField mergedField) {
        this.mergedField = mergedField;
        return this;
    }

    @Override
    public QueryDirectives.Builder field(Field field) {
        this.mergedField = MergedField.newMergedField(field).build();
        return this;
    }

    @Override
    public QueryDirectives.Builder coercedVariables(CoercedVariables coercedVariables) {
        this.coercedVariables = coercedVariables;
        return this;
    }

    @Override
    public QueryDirectives.Builder normalizedVariables(Supplier<NormalizedVariables> normalizedVariables) {
        this.normalizedVariables = normalizedVariables;
        return this;
    }

    @Override
    public QueryDirectives.Builder graphQLContext(GraphQLContext graphQLContext) {
        this.graphQLContext = graphQLContext;
        return this;
    }

    @Override
    public QueryDirectives.Builder locale(Locale locale) {
        this.locale = locale;
        return this;
    }


    @Override
    public QueryDirectives build() {
        return new QueryDirectivesImpl(mergedField, schema, coercedVariables, normalizedVariables, graphQLContext, locale);
    }
}
