#!perl
use Mojo::Base -strict;
use Test::More;
use Mojolicious::Lite;
use Test::Mojo;

## s3 object lifecycle tests
## FIXME: put v1, put v2, get v2, delete v2, get v1, delete v1, get (no version) == 404
if (   $ENV{AWS_REGION}
    && $ENV{AWS_S3_BUCKET}
    && $ENV{AWS_S3_OBJECT}
    && $ENV{AWS_ACCESS_KEY}
    && $ENV{AWS_SECRET_KEY})
{

    plugin 'Mojolicious::Plugin::AWS' => {
        region     => $ENV{AWS_REGION},
        access_key => $ENV{AWS_ACCESS_KEY},
        secret_key => $ENV{AWS_SECRET_KEY},
    };

    my $t = Test::Mojo->new;

    my $s3_bucket = $ENV{AWS_S3_BUCKET};
    my $s3_object = $ENV{AWS_S3_OBJECT};

    my $obj_version = '';
    my $obj_etag    = '';
    $t->app->s3_put_object(
        bucket         => $s3_bucket,
        object         => $s3_object,
        signed_headers => {'Content-Type' => 'application/json; charset=utf-8'},
        payload =>
          [json => {root => {widget_label => 'socks'}, other => {damage_control => 'off'}}]
    )->then(
        sub {
            my $tx = shift;
            ok $tx->res->headers->header('x-amz-request-id'), 'request id header'
              or diag explain $tx->res->headers;

            $obj_etag = $tx->res->headers->etag;
            is $obj_etag, '"40c382963cf66a205d49b258fc2c2f06"', 'ETag header'
              or diag explain $tx->res->headers->etag;

            $obj_version = $tx->res->headers->header('x-amz-version-id');
            ok $obj_version, 'object version';
        }
    )->catch(
        sub {
            my $err = shift;
            ok !$err, "an error occurred" or diag "Error: $err";
            ok 0;
            ok 0;
        }
    )->wait;

    $t->app->s3_get_object(bucket => $s3_bucket, object => $s3_object,)->then(
        sub {
            my $tx = shift;
            ok $tx->res->headers->header('x-amz-request-id'), 'request id header'
              or diag explain $tx->res->headers;

            is $tx->res->headers->etag, $obj_etag, 'ETag match';
            is $tx->res->json('/root/widget_label'), 'socks', 'content match';
        }
    )->catch(
        sub {
            my $err = shift;
            ok !$err, "an error occurred" or diag "Error: $err";
            ok 0;
            ok 0;
        }
    )->wait;

    $t->app->s3_get_object_acl(bucket => $s3_bucket, object => $s3_object,)->then(
        sub {
            my $tx = shift;
            ok $tx->res->headers->header('x-amz-version-id'), 'response has version id header'
              or diag explain $tx->res->headers;
            ok $tx->res->dom->at('AccessControlPolicy > Owner > ID')->text, 'ID element found'
              or diag $tx->res->dom->to_string;
        }
    )->catch(
        sub {
            my $err = shift;
            ok !$err, "an error occurred" or diag "Error: $err";
            ok 0;
        }
    )->wait;

    $t->app->s3_delete_object(
        bucket => $s3_bucket,
        object => $s3_object,
        query  => {VersionId => $obj_version},
    )->then(
        sub {
            my $tx = shift;
            ok $tx->res->headers->header('x-amz-version-id'), 'version id header'
              or diag explain $tx->res->headers;
            is $tx->res->headers->header('x-amz-delete-marker'), 'true', 'amz delete marker';
        }
    )->catch(
        sub {
            my $err = shift;
            ok !$err, "an error occurred" or diag "Error: $err";
            ok 0;
        }
    )->wait;

    $t->app->s3_get_object(bucket => $s3_bucket, object => $s3_object,)->then(
        sub {
            my $tx = shift;
            ok $tx->res->headers->header('x-amz-request-id'), 'request id header'
              or diag explain $tx->res->headers;
            is $tx->res->code, '404', 'object not found';
            is $tx->res->headers->header('X-amz-delete-marker'), 'true', 'delete marker';
        }
    )->catch(
        sub {
            my $err = shift;
            ok !$err, "an error occurred" or diag "Error: $err";
            ok 0;
            ok 0;
        }
    )->wait;
}

done_testing();

__END__
<?xml version="1.0" encoding="UTF-8"?>
<AccessControlPolicy xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
  <Owner>
    <ID>7f236a77ac8ce9b0448a1d3520e6d5365a4cf777eff5f6dce329c3da8d6d6bef</ID>
  </Owner>
  <AccessControlList>
    <Grant>
      <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="CanonicalUser">
        <ID>7f236a77ac8ce9b0448a1d3520e6d5365a4cf777eff5f6dce329c3da8d6d6bef</ID>
      </Grantee>
      <Permission>FULL_CONTROL</Permission>
    </Grant>
  </AccessControlList>
</AccessControlPolicy>