package com.yammer.breakerbox.service.archaius;

import com.yammer.tenacity.core.config.TenacityConfiguration;
import com.yammer.tenacity.core.properties.TenacityPropertyKey;
import com.yammer.tenacity.core.properties.TenacityPropertyRegister;

public class ArchaiusFormatBuilder {
    private final StringBuilder builder = new StringBuilder();

    private ArchaiusFormatBuilder() {}

    public static ArchaiusFormatBuilder builder() {
        return new ArchaiusFormatBuilder();
    }

    public ArchaiusFormatBuilder hystrixMetricsStreamServletMaxConnections(int value) {
        appender("hystrix.stream.maxConcurrentConnections", value);
        return this;
    }

    public ArchaiusFormatBuilder turbineHostRetryMillis(long value) {
        //This mispelling of retry is on purpose. Unfortunate feature relying on a bug.
        appender("turbine.InstanceMonitor.hostRertyMillis", value);
        return this;
    }

    public ArchaiusFormatBuilder turbineInstanceMonitorLatencyThreshold(long value) {
        appender("turbine.InstanceMonitor.eventStream.skipLineLogic.latencyThreshold", value);
        return this;
    }

    public ArchaiusFormatBuilder turbineInstanceMonitorSkipLineDelay(long value) {
        appender("turbine.InstanceMonitor.eventStream.skipLineLogic.delay", value);
        return this;
    }

    public ArchaiusFormatBuilder with(TenacityPropertyKey key,
                                      TenacityConfiguration configuration) {
        executionIsolationThreadTimeoutInMilliseconds(key, configuration);
        threadpoolCoreSize(key, configuration);
        threadpoolMaxQueueSize(key, configuration);
        threadpoolKeepAliveTimeMinutes(key, configuration);
        threadpoolQueueSizeRejectionThreshold(key, configuration);
        threadpoolMetricsRollingStatsNumBuckets(key, configuration);
        threadpoolMetricsRollingStatsTimeInMilliseconds(key, configuration);
        circuitBreakerRequestVolumeThreshold(key, configuration);
        circuitBreakerErrorThresholdPercentage(key, configuration);
        circuitBreakerSleepWindowInMilliseconds(key, configuration);
        circuitBreakermetricsRollingStatsNumBuckets(key, configuration);
        circuitBreakermetricsRollingStatsTimeInMilliseconds(key, configuration);
        semaphoreMaxConcurrentRequests(key, configuration);
        semaphoreFallbackMaxConcurrentRequests(key, configuration);
        executionIsolationStrategy(key, configuration);
        return this;
    }

    public String build() {
        return builder.toString();
    }

    private void executionIsolationThreadTimeoutInMilliseconds(TenacityPropertyKey key,
                                                               TenacityConfiguration configuration) {
        appender(TenacityPropertyRegister.executionIsolationThreadTimeoutInMilliseconds(key),
                configuration.getExecutionIsolationThreadTimeoutInMillis());
    }

    private void threadpoolCoreSize(TenacityPropertyKey key, TenacityConfiguration configuration) {
        appender(TenacityPropertyRegister.threadpoolCoreSize(key), configuration.getThreadpool().getThreadPoolCoreSize());
    }

    private void threadpoolMaxQueueSize(TenacityPropertyKey key, TenacityConfiguration configuration) {
        appender(TenacityPropertyRegister.threadpoolMaxQueueSize(key), configuration.getThreadpool().getMaxQueueSize());
    }

    private void threadpoolKeepAliveTimeMinutes(TenacityPropertyKey key, TenacityConfiguration configuration) {
        appender(TenacityPropertyRegister.threadpoolKeepAliveTimeMinutes(key), configuration.getThreadpool().getKeepAliveTimeMinutes());
    }

    private void threadpoolQueueSizeRejectionThreshold(TenacityPropertyKey key, TenacityConfiguration configuration) {
        appender(TenacityPropertyRegister.threadpoolQueueSizeRejectionThreshold(key), configuration.getThreadpool().getQueueSizeRejectionThreshold());
    }

    private void threadpoolMetricsRollingStatsNumBuckets(TenacityPropertyKey key, TenacityConfiguration configuration) {
        appender(TenacityPropertyRegister.threadpoolMetricsRollingStatsNumBuckets(key), configuration.getThreadpool().getMetricsRollingStatisticalWindowBuckets());
    }

    private void threadpoolMetricsRollingStatsTimeInMilliseconds(TenacityPropertyKey key, TenacityConfiguration configuration) {
        appender(TenacityPropertyRegister.threadpoolMetricsRollingStatsTimeInMilliseconds(key), configuration.getThreadpool().getMetricsRollingStatisticalWindowInMilliseconds());
    }

    private void circuitBreakerRequestVolumeThreshold(TenacityPropertyKey key, TenacityConfiguration configuration) {
        appender(TenacityPropertyRegister.circuitBreakerRequestVolumeThreshold(key), configuration.getCircuitBreaker().getRequestVolumeThreshold());
    }

    private void circuitBreakerErrorThresholdPercentage(TenacityPropertyKey key, TenacityConfiguration configuration) {
        appender(TenacityPropertyRegister.circuitBreakerErrorThresholdPercentage(key), configuration.getCircuitBreaker().getErrorThresholdPercentage());
    }

    private void circuitBreakerSleepWindowInMilliseconds(TenacityPropertyKey key, TenacityConfiguration configuration) {
        appender(TenacityPropertyRegister.circuitBreakerSleepWindowInMilliseconds(key), configuration.getCircuitBreaker().getSleepWindowInMillis());
    }

    private void circuitBreakermetricsRollingStatsNumBuckets(TenacityPropertyKey key, TenacityConfiguration configuration) {
        appender(TenacityPropertyRegister.circuitBreakermetricsRollingStatsNumBuckets(key), configuration.getCircuitBreaker().getMetricsRollingStatisticalWindowBuckets());
    }

    private void circuitBreakermetricsRollingStatsTimeInMilliseconds(TenacityPropertyKey key, TenacityConfiguration configuration) {
        appender(TenacityPropertyRegister.circuitBreakermetricsRollingStatsTimeInMilliseconds(key), configuration.getCircuitBreaker().getMetricsRollingStatisticalWindowInMilliseconds());
    }

    private void semaphoreMaxConcurrentRequests(TenacityPropertyKey key, TenacityConfiguration configuration) {
        appender(TenacityPropertyRegister.semaphoreMaxConcurrentRequests(key), configuration.getSemaphore().getMaxConcurrentRequests());
    }

    private void semaphoreFallbackMaxConcurrentRequests(TenacityPropertyKey key, TenacityConfiguration configuration) {
        appender(TenacityPropertyRegister.semaphoreFallbackMaxConcurrentRequests(key), configuration.getSemaphore().getFallbackMaxConcurrentRequests());
    }

    private void executionIsolationStrategy(TenacityPropertyKey key, TenacityConfiguration configuration) {
        appender(TenacityPropertyRegister.executionIsolationStrategy(key), configuration.getExecutionIsolationStrategy());
    }

    private <ValueType> void appender(String key, ValueType value) {
        builder.append(key);
        builder.append('=');
        builder.append(value);
        builder.append('\n');
    }
}

@@ -754,16 +754,17 @@
 This mis
+s
 pelling 

Fix misspelling