/**
 * 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.feature;

import com.google.common.base.Preconditions;
import com.google.common.collect.Lists;
import com.google.common.util.concurrent.ThreadFactoryBuilder;
import org.apache.distributedlog.DistributedLogConfiguration;
import org.apache.distributedlog.common.config.ConcurrentBaseConfiguration;
import org.apache.distributedlog.common.config.ConfigurationListener;
import org.apache.distributedlog.common.config.ConfigurationSubscription;
import org.apache.distributedlog.common.config.FileConfigurationBuilder;
import org.apache.distributedlog.common.config.PropertiesConfigurationBuilder;
import org.apache.bookkeeper.feature.Feature;
import org.apache.bookkeeper.feature.FeatureProvider;
import org.apache.bookkeeper.feature.SettableFeature;
import org.apache.bookkeeper.stats.StatsLogger;
import org.apache.commons.configuration.ConfigurationException;

import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

/**
 * Feature Provider based dynamic configuration.
 */
public class DynamicConfigurationFeatureProvider extends AbstractFeatureProvider
        implements ConfigurationListener {

    private final ConcurrentBaseConfiguration featuresConf;
    private ConfigurationSubscription featuresConfSubscription;
    private final ConcurrentMap<String, SettableFeature> features;
    private final ScheduledExecutorService executorService;

    public DynamicConfigurationFeatureProvider(String rootScope,
                                               DistributedLogConfiguration conf,
                                               StatsLogger statsLogger) {
        super(rootScope, conf, statsLogger);
        this.features = new ConcurrentHashMap<String, SettableFeature>();
        this.featuresConf = new ConcurrentBaseConfiguration();
        this.executorService = Executors.newSingleThreadScheduledExecutor(
                new ThreadFactoryBuilder().setNameFormat("DynamicConfigurationFeatureProvider-%d").build());
    }

    ConcurrentBaseConfiguration getFeatureConf() {
        return featuresConf;
    }

    ConfigurationSubscription getFeatureConfSubscription() {
        return featuresConfSubscription;
    }

    @Override
    public void start() throws IOException {
        List<FileConfigurationBuilder> fileConfigBuilders =
                Lists.newArrayListWithExpectedSize(2);
        String baseConfigPath = conf.getFileFeatureProviderBaseConfigPath();
        Preconditions.checkNotNull(baseConfigPath);
        File baseConfigFile = new File(baseConfigPath);
        FileConfigurationBuilder baseProperties =
                new PropertiesConfigurationBuilder(baseConfigFile.toURI().toURL());
        fileConfigBuilders.add(baseProperties);
        String overlayConfigPath = conf.getFileFeatureProviderOverlayConfigPath();
        if (null != overlayConfigPath) {
            File overlayConfigFile = new File(overlayConfigPath);
            FileConfigurationBuilder overlayProperties =
                    new PropertiesConfigurationBuilder(overlayConfigFile.toURI().toURL());
            fileConfigBuilders.add(overlayProperties);
        }
        try {
            this.featuresConfSubscription = new ConfigurationSubscription(
                    this.featuresConf,
                    fileConfigBuilders,
                    executorService,
                    conf.getDynamicConfigReloadIntervalSec(),
                    TimeUnit.SECONDS);
        } catch (ConfigurationException e) {
            throw new IOException("Failed to register subscription on features configuration");
        }
        this.featuresConfSubscription.registerListener(this);
    }

    @Override
    public void stop() {
        this.executorService.shutdown();
    }

    @Override
    public void onReload(ConcurrentBaseConfiguration conf) {
        for (Map.Entry<String, SettableFeature> feature : features.entrySet()) {
            String featureName = feature.getKey();
            int availability = conf.getInt(featureName, 0);
            if (availability != feature.getValue().availability()) {
                feature.getValue().set(availability);
                logger.info("Reload feature {}={}", featureName, availability);
            }
        }
    }

    @Override
    protected Feature makeFeature(String featureName) {
        return ConfigurationFeatureProvider.makeFeature(
                featuresConf, features, featureName);
    }

    @Override
    protected FeatureProvider makeProvider(String fullScopeName) {
        return new ConfigurationFeatureProvider(
                fullScopeName, featuresConf, features);
    }
}
