/*
 * Copyright 2016-present Open Networking Laboratory
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.onosproject.store.primitives;

import java.util.concurrent.Executor;
import java.util.function.Supplier;

import org.onosproject.core.ApplicationId;
import org.onosproject.store.service.DistributedPrimitive;
import org.onosproject.store.service.Serializer;

/**
 * Abstract builder for distributed primitives.
 *
 * @param <T> distributed primitive type
 */
public abstract class DistributedPrimitiveBuilder<B extends DistributedPrimitiveBuilder<B, T>,
                                                  T extends DistributedPrimitive> {

    private final DistributedPrimitive.Type type;
    private String name;
    private ApplicationId applicationId;
    private Serializer serializer;
    private Supplier<Executor> executorSupplier;
    private boolean partitionsDisabled = false;
    private boolean meteringDisabled = false;
    private boolean readOnly = false;
    private boolean relaxedReadConsistency = false;

    public DistributedPrimitiveBuilder(DistributedPrimitive.Type type) {
        this.type = type;
    }

    /**
     * Sets the primitive name.
     *
     * @param name primitive name
     * @return this builder
     */
    public B withName(String name) {
        this.name = name;
        return (B) this;
    }

    /**
     * Sets the serializer to use for transcoding info held in the primitive.
     *
     * @param serializer serializer
     * @return this builder
     */
    public B withSerializer(Serializer serializer) {
        this.serializer = serializer;
        return (B) this;
    }

    /**
     * Sets the executor to use for asynchronous callbacks.
     * <p>
     * For partitioned primitives, the provided executor will be shared across all partitions.
     *
     * @param executor the executor to use for asynchronous callbacks
     * @return this builder
     */
    public B withExecutor(Executor executor) {
        return withExecutorSupplier(() -> executor);
    }

    /**
     * Sets the supplier to be used to create executors.
     * <p>
     * When a factory is set, the supplier will be used to create a separate executor for each partition.
     *
     * @param executorSupplier the executor supplier
     * @return this builder
     */
    public B withExecutorSupplier(Supplier<Executor> executorSupplier) {
        this.executorSupplier = executorSupplier;
        return (B) this;
    }

    /**
     * Sets the application id that owns this primitive.
     *
     * @param applicationId application identifier
     * @return this builder
     */
    public B withApplicationId(ApplicationId applicationId) {
        this.applicationId = applicationId;
        return (B) this;
    }

    /**
     * Disables recording usage stats for this primitive.
     * @deprecated usage of this method is discouraged for most common scenarios.
     * @return this builder
     */
    @Deprecated
    public B withMeteringDisabled() {
        this.meteringDisabled = true;
        return (B) this;
    }

    /**
     * Disables state changing operations on the returned distributed primitive.
     * @return this builder
     */
    public B withUpdatesDisabled() {
        this.readOnly = true;
        return (B) this;
    }

    /**
     * Turns on relaxed consistency for read operations.
     * @return this builder
     */
    public B withRelaxedReadConsistency() {
        this.relaxedReadConsistency = true;
        return (B) this;
    }

    /**
     * Returns if metering is enabled.
     *
     * @return {@code true} if yes; {@code false} otherwise
     */
    public final boolean meteringEnabled() {
        return !meteringDisabled;
    }

    /**
     * Returns if partitions are disabled.
     *
     * @return {@code true} if yes; {@code false} otherwise
     */
    public final boolean partitionsDisabled() {
        return partitionsDisabled;
    }

    /**
     * Returns if updates are disabled.
     *
     * @return {@code true} if yes; {@code false} otherwise
     */
    public final boolean readOnly() {
        return readOnly;
    }

    /**
     * Returns if consistency is relaxed for read operations.
     *
     * @return {@code true} if yes; {@code false} otherwise
     */
    public final boolean relaxedReadConsistency() {
        return relaxedReadConsistency;
    }

    /**
     * Returns the serializer.
     *
     * @return serializer
     */
    public final Serializer serializer() {
        return serializer;
    }

    /**
     * Returns the executor supplier.
     *
     * @return executor supplier
     */
    public final Supplier<Executor> executorSupplier() {
        return executorSupplier;
    }

    /**
     * Returns the application identifier.
     *
     * @return application id
     */
    public final ApplicationId applicationId() {
        return applicationId;
    }

    /**
     * Returns the name of the primitive.
     *
     * @return primitive name
     */
    public final String name() {
        return name;
    }

    /**
     * Returns the primitive type.
     *
     * @return primitive type
     */
    public final DistributedPrimitive.Type type() {
        return type;
    }

    /**
     * Constructs an instance of the distributed primitive.
     * @return distributed primitive
     */
    public abstract T build();
}
