#
# 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.
#

whisk {
  s3 {

    # Name of S3 bucket
    # bucket =

    # Folder path within the bucket (optional)
    # prefix =

    # CloudFront configuration - Enable this if the attachments are to be read from the CloudFront CDN
    # cloud-front-config {
        # CloudFront domain name
        # domain-name = xxx.cloudfront.net

        # Signing key pair id
        # https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-trusted-signers.html#private-content-creating-cloudfront-key-pairs
        # key-pair-id = AAXXXX

        # Private key content in PEM format
        # private-key = """-----BEGIN RSA PRIVATE KEY-----xxx-----END RSA PRIVATE KEY-----"""

        # Timeout for generated signed url
        # timeout = 10 min
    # }

    # See https://github.com/akka/alpakka/blob/v1.0.0/s3/src/main/resources/reference.conf
    alpakka {
      # whether the buffer request chunks (up to 5MB each) to "memory" or "disk"
      buffer = "memory"

      # location for temporary files, if buffer is set to "disk". If empty, uses the standard java temp path.
      disk-buffer-path = ""

      proxy {
        # hostname of the proxy. If undefined ("") proxy is not enabled.
        host = ""
        port = 8000

        # if "secure" is set to "true" then HTTPS will be used for all requests to S3, otherwise HTTP will be used
        secure = true
      }

      # default values for AWS configuration. If credentials and/or region are not specified when creating S3Client,
      # these values will be used.
      aws {
        # If this section is absent, the fallback behavior is to use the
        # com.amazonaws.auth.DefaultAWSCredentialsProviderChain instance to resolve credentials
        credentials {
          # supported providers:
          # anon - anonymous requests ("no auth")
          # static - static credentials,
          #   required params:
          #     access-key-id
          #     secret-access-key
          #   optional:
          #     token
          # default: as described in com.amazonaws.auth.DefaultAWSCredentialsProviderChain docs,
          # attempts to get the credentials from either:
          #   - environment variables
          #   - system properties
          #   - credentials file
          #   - EC2 credentials service
          #   - IAM / metadata
          provider = default
        }

        # If this section is absent, the fallback behavior is to use the
        # com.amazonaws.regions.AwsRegionProvider.DefaultAwsRegionProviderChain instance to resolve region
        region {
          # supported providers:
          # static - static credentials,
          #   required params:
          #     default-region
          # default: as described in com.amazonaws.regions.AwsRegionProvider.DefaultAwsRegionProviderChain docs,
          # attempts to get the region from either:
          #   - environment variables
          #   - system properties
          #   - progile file
          #   - EC2 metadata
          provider = default
        }
      }

      # Enable path style access to s3, i.e. "https://s3-eu-west-1.amazonaws.com/my.bucket/myobject"
      # Default is virtual-hosted style.
      # When using virtual hosted–style buckets with SSL, the S3 wild card certificate only matches buckets that do not contain periods.
      # Buckets containing periods will lead to certificate errors. In those cases it's useful to enable path-style access.
      path-style-access = true

      # Custom endpoint url, used for alternate s3 implementations
      # endpoint-url = null

      # Which version of the list bucket api to use. Set to 1 to use the old style version 1 API.
      # By default the newer version 2 api is used.
      list-bucket-api-version = 2
    }
  }
}
