#!/usr/bin/env perl

use strict;
use warnings;

use lib 't/lib';

use English qw(-no-match-vars);
use Carp;
use Test::More;
use URI::Escape;
use Digest::SHA 'sha256_hex';

use Paws;
use Paws::Net::MockCaller;

my $paws = Paws->new(config => {
  caller => Paws::Net::MockCaller->new(
    mock_dir => 't/glacier/jobs',
    mock_mode => 'RECORD',
  ),
#  credentials => 'Test::CustomCredentials'
});

my $glacier = $paws->service('Glacier', region => 'us-west-2');

## We may need to upload an Archive to test this?

# my $archive = $glacier->UploadArchive(
#     AccountId => '-',
#     ArchiveDescription => 'Just a Test',
#     VaultName => 'testvault',
#     Body => 'X' x 1048576,
#     Checksum => sha256_hex('X' x 1048576),
# );

# my $archiveid = $archive->ArchiveId;
# diag($archiveid);
my $archiveid = 'QFr2GMkmVvi4ZUD02PRHFPMcOCtQQwFh-bq6oAiGEnC5MdSQadSJPXs6bw3Ik3CIPjPbS-FZKW2xXBowUYv_V2i4hbrQ7L8t0rl2LGwvB36ArZxateetDSrkCagioUHRRCa2seWLfw';

my $init_job_output = $glacier->InitiateJob(
  AccountId => '-',
  JobParameters => {
    ArchiveId => $archiveid,
    Description => 'My new job',
    Type => 'archive-retrieval'
  },
  VaultName => 'testvault',
 );

ok($init_job_output->JobId, 'New job has an Id');

my $job_list = $glacier->ListJobs(
  AccountId => '-',
  VaultName => 'testvault',
    );

ok( (grep { $_->JobId eq $init_job_output->JobId } (@{ $job_list->JobList })), 'Found JobId in JobList');

my ($finished_job) = grep { $_->Completed } (@{ $job_list->JobList });
ok( $finished_job, 'Found Completed Job in JobList');

my $job_desc = $glacier->DescribeJob(
  AccountId => '-',
  VaultName => 'testvault',
  JobId => $finished_job->JobId,
);

is($job_desc->ArchiveId, $archiveid, 'Got correct Job');
ok($job_desc->Completed, 'Job is finished');

my $result = $glacier->GetJobOutput(
  AccountId => '-',
  VaultName => 'testvault',
  JobId => $finished_job->JobId,
);

is($result->Body, 'X' x 1048576, 'Retrieved Archive body');
is($result->Checksum, sha256_hex('X' x 1048576), 'Checksum matches');
   
# Path only for select type jobs
# ok($init_job_output->JobOutputPath, 'New job has a path');

done_testing;