/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.apache.distributedlog.client;

import static com.google.common.base.Preconditions.checkNotNull;

import java.util.concurrent.TimeUnit;

/**
 * Client Config.
 */
public class ClientConfig {
    int redirectBackoffStartMs = 25;
    int redirectBackoffMaxMs = 100;
    int maxRedirects = -1;
    int requestTimeoutMs = -1;
    boolean thriftmux = false;
    boolean streamFailfast = false;
    String streamNameRegex = ".*";
    boolean handshakeWithClientInfo = true;
    long periodicHandshakeIntervalMs = TimeUnit.MINUTES.toMillis(5);
    long periodicOwnershipSyncIntervalMs = TimeUnit.MINUTES.toMillis(5);
    boolean periodicDumpOwnershipCacheEnabled = false;
    long periodicDumpOwnershipCacheIntervalMs = TimeUnit.MINUTES.toMillis(10);
    boolean enableHandshakeTracing = false;
    boolean enableChecksum = true;

    public ClientConfig setMaxRedirects(int maxRedirects) {
        this.maxRedirects = maxRedirects;
        return this;
    }

    public int getMaxRedirects() {
        return this.maxRedirects;
    }

    public ClientConfig setRequestTimeoutMs(int timeoutInMillis) {
        this.requestTimeoutMs = timeoutInMillis;
        return this;
    }

    public int getRequestTimeoutMs() {
        return this.requestTimeoutMs;
    }

    public ClientConfig setRedirectBackoffStartMs(int ms) {
        this.redirectBackoffStartMs = ms;
        return this;
    }

    public int getRedirectBackoffStartMs() {
        return this.redirectBackoffStartMs;
    }

    public ClientConfig setRedirectBackoffMaxMs(int ms) {
        this.redirectBackoffMaxMs = ms;
        return this;
    }

    public int getRedirectBackoffMaxMs() {
        return this.redirectBackoffMaxMs;
    }

    public ClientConfig setThriftMux(boolean enabled) {
        this.thriftmux = enabled;
        return this;
    }

    public boolean getThriftMux() {
        return this.thriftmux;
    }

    public ClientConfig setStreamFailfast(boolean enabled) {
        this.streamFailfast = enabled;
        return this;
    }

    public boolean getStreamFailfast() {
        return this.streamFailfast;
    }

    public ClientConfig setStreamNameRegex(String nameRegex) {
        checkNotNull(nameRegex);
        this.streamNameRegex = nameRegex;
        return this;
    }

    public String getStreamNameRegex() {
        return this.streamNameRegex;
    }

    public ClientConfig setHandshakeWithClientInfo(boolean enabled) {
        this.handshakeWithClientInfo = enabled;
        return this;
    }

    public boolean getHandshakeWithClientInfo() {
        return this.handshakeWithClientInfo;
    }

    public ClientConfig setPeriodicHandshakeIntervalMs(long intervalMs) {
        this.periodicHandshakeIntervalMs = intervalMs;
        return this;
    }

    public long getPeriodicHandshakeIntervalMs() {
        return this.periodicHandshakeIntervalMs;
    }

    public ClientConfig setPeriodicOwnershipSyncIntervalMs(long intervalMs) {
        this.periodicOwnershipSyncIntervalMs = intervalMs;
        return this;
    }

    public long getPeriodicOwnershipSyncIntervalMs() {
        return this.periodicOwnershipSyncIntervalMs;
    }

    public ClientConfig setPeriodicDumpOwnershipCacheEnabled(boolean enabled) {
        this.periodicDumpOwnershipCacheEnabled = enabled;
        return this;
    }

    public boolean isPeriodicDumpOwnershipCacheEnabled() {
        return this.periodicDumpOwnershipCacheEnabled;
    }

    public ClientConfig setPeriodicDumpOwnershipCacheIntervalMs(long intervalMs) {
        this.periodicDumpOwnershipCacheIntervalMs = intervalMs;
        return this;
    }

    public long getPeriodicDumpOwnershipCacheIntervalMs() {
        return this.periodicDumpOwnershipCacheIntervalMs;
    }

    public ClientConfig setHandshakeTracingEnabled(boolean enabled) {
        this.enableHandshakeTracing = enabled;
        return this;
    }

    public boolean isHandshakeTracingEnabled() {
        return this.enableHandshakeTracing;
    }

    public ClientConfig setChecksumEnabled(boolean enabled) {
        this.enableChecksum = enabled;
        return this;
    }

    public boolean isChecksumEnabled() {
        return this.enableChecksum;
    }

    public static ClientConfig newConfig(ClientConfig config) {
        ClientConfig newConfig = new ClientConfig();
        newConfig.setMaxRedirects(config.getMaxRedirects())
                 .setRequestTimeoutMs(config.getRequestTimeoutMs())
                 .setRedirectBackoffStartMs(config.getRedirectBackoffStartMs())
                 .setRedirectBackoffMaxMs(config.getRedirectBackoffMaxMs())
                 .setThriftMux(config.getThriftMux())
                 .setStreamFailfast(config.getStreamFailfast())
                 .setStreamNameRegex(config.getStreamNameRegex())
                 .setHandshakeWithClientInfo(config.getHandshakeWithClientInfo())
                 .setPeriodicHandshakeIntervalMs(config.getPeriodicHandshakeIntervalMs())
                 .setPeriodicDumpOwnershipCacheEnabled(config.isPeriodicDumpOwnershipCacheEnabled())
                 .setPeriodicDumpOwnershipCacheIntervalMs(config.getPeriodicDumpOwnershipCacheIntervalMs())
                 .setHandshakeTracingEnabled(config.isHandshakeTracingEnabled())
                 .setChecksumEnabled(config.isChecksumEnabled());
        return newConfig;
    }
}
