package GNPCB::MTurk;
require 5.8.0;
require Exporter;
use strict;
use warnings;

###########
# Parts of this perl module are based on Mechanical Turk sample code provided by Amazon
###########

#export
our @ISA = qw(Exporter);
our @EXPORT = qw(CreateHit MTurkDebug RegisterHitType GetReviewableHits SetHitAsReviewing
	GetAssignmentsForHit ApproveAssignment RejectAssignment DisposeHit GetHit);

#modules
use Digest::HMAC_SHA1 qw(hmac_sha1);
use MIME::Base64;
use LWP;
use XML::XPath;
use Date::Format;

# specific variables
my $access_key = "xxxxxx"; 
my $secret_key = "xxxxxx";
my $service_name = "AWSMechanicalTurkRequester";
my $version = "2006-03-20";
my $url = "http://mechanicalturk.amazonaws.com/onca/xml?Service=$service_name&Version=$version";
my ($ua, $response, $debug);

# start subroutines
sub CreateHit
{
	return do_normal_request('CreateHIT', @_);
}

sub RegisterHitType
{
	return do_normal_request('RegisterHITType', @_);
}

sub GetReviewableHits
{
	return do_normal_request('GetReviewableHITs', @_);
}

sub SetHitAsReviewing
{
	return do_normal_request('SetHITAsReviewing', @_);
}

sub GetAssignmentsForHit
{
	return do_normal_request('GetAssignmentsForHIT', @_);
}

sub ApproveAssignment
{
	return do_normal_request('ApproveAssignment', @_);
}

sub RejectAssignment
{
	return do_normal_request('RejectAssignment', @_);
}

sub GetHit
{
	return do_normal_request('GetHIT', @_);
}

sub DisposeHit
{
	return do_normal_request('DisposeHIT', @_);
}

sub MTurkDebug
{
	$debug = 1;
}

sub do_normal_request
{
	my ($op, %args) = @_;
	$args{Operation} = $op;
	do_request(%args);
	return $response->content;
}

sub do_request
{
	my %args = @_;
	$args{AWSAccessKeyId} = $access_key;
	$args{Timestamp} = generate_timestamp();
	$args{Signature} = generate_signature($args{Operation}, $args{Timestamp});
	$args{Validate} = 'true' if ($debug);
	$ua = LWP::UserAgent->new;
	$response = $ua->post($url, \%args);
}

sub generate_signature
{
	my ($operation, $timestamp) = @_;
	my $string_to_encode = $service_name . $operation . $timestamp;
	my $signature = encode_base64(hmac_sha1($string_to_encode, $secret_key));
	chop $signature;
	return $signature;
}

sub generate_timestamp
{
	my ($t) = @_;
	$t ||= time;
	return time2str('%Y-%m-%dT%H:%M:%S.000Z', $t, 'GMT');
}
1;
