package com.baeldung.spring.cloud.archaius.dynamosources.config;

import java.util.Arrays;

import org.apache.commons.configuration.AbstractConfiguration;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper;
import com.amazonaws.services.dynamodbv2.model.CreateTableRequest;
import com.amazonaws.services.dynamodbv2.model.ProvisionedThroughput;
import com.amazonaws.services.dynamodbv2.util.TableUtils;
import com.baeldung.spring.cloud.archaius.dynamosources.dynamodb.ArchaiusProperties;
import com.baeldung.spring.cloud.archaius.dynamosources.dynamodb.ArchaiusPropertiesRepository;
import com.netflix.config.DynamicConfiguration;
import com.netflix.config.FixedDelayPollingScheduler;
import com.netflix.config.PolledConfigurationSource;
import com.netflix.config.sources.DynamoDbConfigurationSource;

@Configuration
public class ApplicationPropertiesConfigurations {

    @Autowired
    AmazonDynamoDB amazonDynamoDb;

    @Autowired
    private ArchaiusPropertiesRepository repository;

    @Bean
    public AbstractConfiguration addApplicationPropertiesSource() {
        // Normally, the DB Table would be already created and populated.
        // In this case, we'll do it just before creating the archaius config source that uses it
        initDatabase();
        PolledConfigurationSource source = new DynamoDbConfigurationSource(amazonDynamoDb);
        return new DynamicConfiguration(source, new FixedDelayPollingScheduler());
    }

    private void initDatabase() {
        // Create the table
        DynamoDBMapper mapper = new DynamoDBMapper(amazonDynamoDb);
        CreateTableRequest tableRequest = mapper.generateCreateTableRequest(ArchaiusProperties.class);
        tableRequest.setProvisionedThroughput(new ProvisionedThroughput(1L, 1L));
        TableUtils.createTableIfNotExists(amazonDynamoDb, tableRequest);

        // Populate the table
        ArchaiusProperties property = new ArchaiusProperties("baeldung.archaius.properties.one", "one FROM:dynamoDB");
        ArchaiusProperties property3 = new ArchaiusProperties("baeldung.archaius.properties.three", "three FROM:dynamoDB");
        repository.saveAll(Arrays.asList(property, property3));
    }
}