package com.yammer.breakerbox.turbine;

import com.google.common.base.Joiner;
import com.netflix.config.ConfigurationManager;
import com.netflix.turbine.discovery.InstanceDiscovery;
import com.netflix.turbine.monitor.cluster.ClusterMonitorFactory;
import com.netflix.turbine.plugins.PluginsFactory;
import org.apache.commons.configuration.AbstractConfiguration;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Collection;

public class TurbineInstanceDiscovery {
    private static final Logger LOGGER = LoggerFactory.getLogger(TurbineInstanceDiscovery.class);
    public static final String BREAKERBOX_INSTANCE_ID = "Breakerbox-Instance-Id";
    public static final String DEFAULT_URL_SUFFIX = "/tenacity/metrics.stream";

    private TurbineInstanceDiscovery() {}

    public static void registerClusters(Collection<String> clusterNames) {
        registerClusters(clusterNames, DEFAULT_URL_SUFFIX);
    }

    public static void registerClusters(Collection<String> clusterNames,
                                        String instanceUrlSuffix) {
        final AbstractConfiguration configurationManager = ConfigurationManager.getConfigInstance();
        configurationManager.setProperty(InstanceDiscovery.TURBINE_AGGREGATOR_CLUSTER_CONFIG,
                Joiner.on(',').join(clusterNames));
        configurationManager.setProperty("turbine.instanceUrlSuffix", instanceUrlSuffix);
        final ClusterMonitorFactory<?> clusterMonitorFactory = PluginsFactory.getClusterMonitorFactory();
        if (clusterMonitorFactory != null) {
            try {
                clusterMonitorFactory.initClusterMonitors();
            } catch (Exception err) {
                LOGGER.error("Trouble initializing cluster monitors", err);
            }
        }
    }
}