package Common::Amazon::SQS;

use constant 'MAXNUMMSG' => 10;

use strict;
use warnings;

use Paws;
use JSON::XS;
use Paws::Credential::Explicit;
use DateTime::Format::DateParse;

use base 'Class::Accessor';

__PACKAGE__->mk_accessors(qw/qname queue qurl/);

use lib '/app/tools/common/lib';
use Common::Amazon::Config;

sub new {
    my $class = shift;
    my $self  = {};
    bless $self, $class;
    die __PACKAGE__ . '::qname must be set by child object' unless defined $self->qname;
    $self->_init();
    $self;
}

sub _init {
    my $self = shift;

    my ( $access, $secret, $region ) = get_aws_creds('sqs');

    my $account     = '290365479392';
    my $http_path   = "https://sqs." . $region . ".amazonaws.com/$account";
    my $credentials = Paws::Credential::Explicit->new( 'access_key' => $access, 'secret_key' => $secret );

    $self->qurl( $http_path . '/' . $self->qname );
    $self->queue( Paws->service( 'SQS', region => $region, 'credentials' => $credentials ) );

}

sub message_ref {
    my $self    = shift;
    my $message = shift;
    JSON::XS::decode_json( $message->Body );
}

sub get_messages {
    my $self = shift;
    my $result = $self->queue->ReceiveMessage( 'QueueUrl' => $self->qurl, 'WaitTimeSeconds' => 5, 'MaxNumberOfMessages' => MAXNUMMSG );
    $result->Messages if defined $result;
}

sub get_message {
    my $self = shift;
    my $msgs = $self->queue->ReceiveMessage( 'QueueUrl' => $self->qurl, 'WaitTimeSeconds' => 5, 'MaxNumberOfMessages' => 1 );
    my $message;
    if ( defined $msgs and scalar @{ $msgs->Messages } == 1 ) {
        $message = $msgs->Messages->[0];
    }
    $message;
}

sub delete_message {
    my $self    = shift;
    my $message = shift;
    my $params  = { 'QueueUrl' => $self->qurl, 'ReceiptHandle' => $message->ReceiptHandle };
    my $resp    = $self->queue->DeleteMessage( %{$params} );
    $resp;
}

sub freeze_message {
    my $self    = shift;
    my $message = shift;
    my $timeout = shift || 120;
    my $params  = { 'QueueUrl' => $self->qurl, 'ReceiptHandle' => $message->ReceiptHandle, 'VisibilityTimeout' => $timeout };
    my $resp    = $self->queue->ChangeMessageVisibility( %{$params} );
    $resp;
}

sub parse_timestamp {
    my $self     = shift;
    my $time     = shift;
    my $dtime    = DateTime::Format::DateParse->parse_datetime($time);
    my $timezone = 'America/Los_Angeles';
    $dtime->set_time_zone($timezone)->datetime(' ');

}

1;
