/*
 * Copyright 2018-present Open Networking Foundation
 *
 * 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.opencord.kafka.impl;

import org.onosproject.core.ApplicationId;
import org.onosproject.net.config.Config;

/**
 * Configuration of the Kafka publishing endpoint.
 */
public class KafkaConfig extends Config<ApplicationId> {

    private static final String BOOTSTRAP_SERVERS = "bootstrapServers";
    private static final String RETRIES = "retries";
    private static final String RECONNECT_BACKOFF = "reconnectBackoff";
    private static final String INFLIGHT_REQUESTS = "inflightRequests";
    private static final String ACKS = "acks";

    private static final String DEFAULT_RETRIES = "1";
    private static final String DEFAULT_RECONNECT_BACKOFF = "500";
    private static final String DEFAULT_INFLIGHT_REQUESTS = "5";
    private static final String DEFAULT_ACKS = "1";

    @Override
    public boolean isValid() {
        return hasOnlyFields(BOOTSTRAP_SERVERS, RETRIES, RECONNECT_BACKOFF,
                INFLIGHT_REQUESTS, ACKS) && hasFields(BOOTSTRAP_SERVERS);
    }

    /**
     * Returns the Kafka bootstrap servers.
     * <p>
     * This can be a hostname/IP and port (e.g. 10.1.1.1:9092).
     * </p>
     *
     * @return Kafka bootstrap servers
     */
    public String getBootstrapServers() {
        return object.path(BOOTSTRAP_SERVERS).asText();
    }

    /**
     * Returns the number of retries.
     *
     * @return retries
     */
    public String getRetries() {
        return get(RETRIES, DEFAULT_RETRIES);
    }

    /**
     * Returns the reconnect backoff in milliseconds.
     *
     * @return reconnect backoff
     */
    public String getReconnectBackoff() {
        return get(RECONNECT_BACKOFF, DEFAULT_RECONNECT_BACKOFF);
    }

    /**
     * Returns the number of inflight requests.
     *
     * @return inflight requests
     */
    public String getInflightRequests() {
        return get(INFLIGHT_REQUESTS, DEFAULT_INFLIGHT_REQUESTS);
    }

    /**
     * Returns the number of acks.
     *
     * @return acks
     */
    public String getAcks() {
        return get(ACKS, DEFAULT_ACKS);
    }
}
