package io.digdag.storage.s3;

import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.AWSCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.auth.DefaultAWSCredentialsProviderChain;
import com.amazonaws.auth.PropertiesFileCredentialsProvider;;
import com.amazonaws.ClientConfiguration;
import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.services.s3.S3ClientOptions;
import io.digdag.client.config.Config;
import io.digdag.spi.Storage;
import io.digdag.spi.StorageFactory;

public class S3StorageFactory
    implements StorageFactory
{
    @Override
    public String getType()
    {
        return "s3";
    }

    @Override
    public Storage newStorage(Config config)
    {
        AmazonS3Client client = new AmazonS3Client(
                buildCredentialsProvider(config),
                buildClientConfiguration(config));
        if (config.has("endpoint")) {
            client.setEndpoint(config.get("endpoint", String.class));
        }

        if (config.has("path-style-access")) {
            client.setS3ClientOptions(
              S3ClientOptions.builder().setPathStyleAccess(
                config.get("path-style-access", Boolean.class, false)
              ).build());
        }

        String bucket = config.get("bucket", String.class);

        return new S3Storage(config, client, bucket);
    }

    private static ClientConfiguration buildClientConfiguration(Config config)
    {
        // TODO build from config with log-server.s3.client prefix
        return new ClientConfiguration();
    }

    private static AWSCredentialsProvider buildCredentialsProvider(Config config)
    {
        if (config.has("credentials.file")) {
            return new PropertiesFileCredentialsProvider(
                    config.get("credentials.file", String.class));
        }
        else if (config.has("credentials.access-key-id")) {
            final BasicAWSCredentials creds = new BasicAWSCredentials(
                config.get("credentials.access-key-id", String.class),
                config.get("credentials.secret-access-key", String.class));
            return new AWSCredentialsProvider()
            {
                @Override
                public AWSCredentials getCredentials()
                {
                    return creds;
                }

                @Override
                public void refresh()
                { }
            };
        }
        else {
            return new DefaultAWSCredentialsProviderChain();
        }
    }
}