<?xml version="1.0"?>
<!--
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

https://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.
-->
<project default="compile" name="s3"
         xmlns:ivy="antlib:org.apache.ivy.ant"
         xmlns:if="ant:if">

  <!-- easy way to override properties -->
  <property file="build.properties"/>

  <!-- don't fork junit; regexp classes not available -->
  <property name="junit.fork" value="false" />

  <property name="javac.-source" value="1.8" />
  <property name="javac.-target" value="1.8" />

  <import file="common/build.xml"/>

  <property name="ivy.report.todir" location="${build}/ivyreports" />

  <target name="install-all" depends="install">
    <ivy:retrieve pattern="${ant.home}/lib/[artifact]-[revision].[ext]" conf="default" />
  </target>

  <target name="ready-to-test-with-antunit" depends="common.ready-to-test-with-antunit,antunit-prepare" />

  <target name="antunit-prepare" depends="setup-s3">
    <path id="antlib.cp">
      <path refid="classpath.test" />
      <pathelement location="${target.jar}" />
    </path>
    <classloader classpathref="antlib.cp" />
    <typedef resource="org/apache/ant/s3/antlib.xml" uri="antlib:org/apache/ant/s3" classpathref="antlib.cp" />
    <typedef resource="org/apache/ant/s3cs/antlib.xml" uri="antlib:org/apache/ant/s3cs" classpathref="antlib.cp" />
    <path id="classpath.antlib">
      <path refid="classpath.test" />
      <pathelement location="${target.jar}" />
    </path>
  </target>

  <target name="groovy-setup" depends="resolve">
    <presetdef name="groovy">
      <script manager="javax" classpathref="classpath.test" language="groovy" />
    </presetdef>
  </target>

  <target name="start-s3" depends="groovy-setup">
    <property name="s3.start" value="true" />
    <tempfile destdir="${java.io.tmpdir}" property="s3mockRoot" prefix="antlib-s3mock-" />
    <groovy if:true="${s3.start}">
      def s3Mock = com.adobe.testing.s3mock.S3MockApplication.start("--root=${s3mockRoot}", '--initialBuckets=foo,bar')
      project.addReference('s3Mock', s3Mock)
    </groovy>
  </target>

  <target name="setup-s3" depends="start-s3">
    <property name="s3.setup" value="true" />
    <groovy>
      import static com.adobe.testing.s3mock.S3MockApplication.DEFAULT_HTTPS_PORT
      import static software.amazon.awssdk.http.SdkHttpConfigurationOption.TRUST_ALL_CERTIFICATES

      import software.amazon.awssdk.auth.credentials.AwsBasicCredentials
      import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider
      import software.amazon.awssdk.core.sync.RequestBody
      import software.amazon.awssdk.http.urlconnection.UrlConnectionHttpClient
      import software.amazon.awssdk.regions.Region
      import software.amazon.awssdk.services.s3.S3Client
      import software.amazon.awssdk.utils.AttributeMap

      def s3Endpoint = "https://localhost:${DEFAULT_HTTPS_PORT}"
      project.setProperty('s3.endpoint', s3Endpoint)

      def s3 = { -> S3Client.builder()
        .region(Region.of("us-east-1"))
        .credentialsProvider(
          StaticCredentialsProvider.create(
            AwsBasicCredentials.create("foo", "bar")
          )
        )
        .endpointOverride(URI.create(s3Endpoint))
        .httpClient(
          UrlConnectionHttpClient.builder().buildWithDefaults(
            AttributeMap.builder().put(TRUST_ALL_CERTIFICATES, Boolean.TRUE).build()
          )
        )
        .build()
      }

      project.addReference("s3g", s3)

      if (Boolean.parseBoolean(project.getProperty('s3.setup'))) {
        s3 = s3()

        try (s3) {
          ['a', 'b', 'c'].each {
            s3.putObject({ b -> b.bucket('foo').key(it).metadata([B: 'foo']).tagging("T1=${it}") }, RequestBody.fromString(it))
          }
          ['x', 'y', 'z'].each {
            s3.putObject({ b -> b.bucket('bar').key(it).metadata([B: 'bar']).tagging("T1=${it}") }, RequestBody.fromString(it))
          }
        }
      }
    </groovy>
    <echo>$${s3.endpoint}=${s3.endpoint}</echo>
  </target>

  <target name="antunit-test" depends="ready-to-test-with-antunit,resolve"
          unless="skip-antunit">
    <condition property="antunit.includes" value="${antunit.testcase}"
               else="**/test.xml,**/*-test.xml">
      <isset property="antunit.testcase" />
    </condition>

    <property name="antunit.excludes" value="" />

    <mkdir dir="${antunit.report.dir}" />

    <au:antunit xmlns:au="antlib:org.apache.ant.antunit"
      failOnError="false"
      errorProperty="antunit.tests.failed">
      <fileset dir="${src.antunit}" includes="${antunit.includes}"
               excludes="${antunit.excludes}" />

      <au:xmllistener todir="${antunit.report.dir}" />
      <au:plainlistener/>
      <propertyset>
        <propertyref name="s3.endpoint" />
      </propertyset>
      <au:reference refid="ant.coreLoader" />
      <au:reference refid="classpath.antlib" />
    </au:antunit>

    <groovy if:true="${s3.start}">
      project.getReference('s3Mock').stop()
    </groovy>
  </target>

  <target name="stop-s3" depends="setup-s3">
    <groovy>
      project.getReference('s3Mock').stop()
    </groovy>
  </target>

  <target name="s3-test" depends="setup-s3">
    <groovy>
      try (def s3 = project.getReference('s3g')()) {
        println "BUCKETS: ${s3.listBuckets().buckets()}"
        println "FOO: ${s3.listObjectsV2 { b -> b.bucket('foo') }.contents()}"
        println "BAR: ${s3.listObjectsV2 { b -> b.bucket('bar') }.contents()}"
        println "HEAD: ${s3.headObject { b -> b.bucket('foo').key('a') }}"
        println "TAG: ${s3.getObjectTagging { b -> b.bucket('foo').key('a') }.tagSet()}"
      }
    </groovy>
    <sequential if:true="${s3.start}">
      <input message="continue" />
      <groovy>
        project.getReference('s3Mock').stop()
      </groovy>
    </sequential>
  </target>

  <target name="groovy-test" depends="groovy-setup">
    <groovy>
      println com.adobe.testing.s3mock.S3MockApplication.DEFAULT_HTTPS_PORT
    </groovy>
  </target>

  <target name="clean-all" depends="clean">
    <delete dir="${lib.dir}" />
  </target>

  <target name="resolve-all" depends="install-ivy,-no-resolve" if="with.ivy" unless="no.resolve">
    <ivy:resolve file="ivy.xml" conf="*(public),test" />
    <ivy:retrieve pattern="${lib.dir}/[conf]/[artifact].[ext]" sync="yes" />
  </target>

  <target name="publish-local" depends="prepare-upload">
    <ivy:publish resolver="local"
                 haltonmissing="false"
                 overwrite="true"
                 artifactspattern="${build.javarepository}/[organisation]/[module]/[revision]/[artifact]-[revision](-[classifier]).[ext]" />
  </target>

  <target name="ivy-report" depends="install-ivy,-no-resolve" if="with.ivy" unless="no.resolve">
    <ivy:resolve file="ivy.xml" />
    <ivy:report />
  </target>

</project>
