/**
 * 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 com.twitter.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;
    }
}
