package WWW::Asana::Request;
BEGIN {
  $WWW::Asana::Request::AUTHORITY = 'cpan:GETTY';
}
{
  $WWW::Asana::Request::VERSION = '0.003';
}
# ABSTRACT: Asana Request Class

use MooX qw(
	+HTTP::Request
	+JSON
	+URI
	+URI::QueryParam
);

has api_key => (
	is => 'ro',
	required => 1,
);

has to => (
	is => 'ro',
	required => 1,
);

has to_type => (
	is => 'ro',
	lazy => 1,
	builder => 1,
);

sub _build_to_type {
	my ( $self ) = @_;
	if ( $self->to =~ /\[(\w+)\]/ ) {
		return $1;
	} else {
		return $self->to;	
	}
}

has to_multi => (
	is => 'ro',
	lazy => 1,
	builder => 1,
);

sub _build_to_multi {
	my ( $self ) = @_;
	if ( $self->to =~ /\[(\w+)\]/ ) {
		return 1;
	} else {
		return 0;	
	}
}

has uri => (
	is => 'ro',
	required => 1,
);

has data => (
	is => 'ro',
	predicate => 'has_data',
);

has params => (
	is => 'ro',
	predicate => 'has_params',
);

has codes => (
	is => 'ro',
	predicate => 'has_codes',
);

has method => (
	is => 'ro',
	default => sub { 'GET' }
);

has _http_request => (
	is => 'ro',
	lazy => 1,
	builder => 1,
);
sub http_request { shift->_http_request }

has json => (
	is => 'ro',
	lazy => 1,
	builder => 1,
);

sub _build_json {
	my $json = JSON->new;
	$json->allow_nonref;
	return $json;
}

sub _build__http_request {
	my ( $self ) = @_;
	my %data;
	%data = %{$self->data} if $self->has_data;
	my @params;
	@params = @{$self->params} if $self->has_params;
	if ($self->to_multi) {
		my $type = $self->to_type;
		if ($type eq 'Task') {
			push @params, [ opt_fields => join(',',qw(
				assignee
				assignee_status
				created_at
				completed
				completed_at
				due_on
				modified_at
				name
				notes
			)) ];
		} elsif ($type eq 'Story') {
			push @params, [ opt_fields => join(',',qw(
				created_at
				created_by
				text
				target
				source
				type
			)) ];
		} elsif ($type eq 'Project') {
			push @params, [ opt_fields => join(',',qw(
				created_at
				modified_at
				name
				notes
			)) ];
		} elsif ($type eq 'Tag') {
			push @params, [ opt_fields => join(',',qw(
				created_at
				name
				notes
			)) ];
		} elsif ($type eq 'User') {
			push @params, [ opt_fields => join(',',qw(
				name
				email
			)) ];
		} elsif ($type eq 'Workspace') {
			push @params, [ opt_fields => join(',',qw(
				name
			)) ];
		}
	}
	if ($self->has_data) {
		$data{$_} = $self->data->{$_} for (keys %{$self->data});
	}
	my @headers;
	my $uri;
	my $body;
	my $u = URI->new($self->uri);
	$u->query_param(@{$_}) for @params;
	$uri = $u->as_string;
	if ($self->method ne 'GET') {
		push @headers, ('Content-type', 'application/json');
		$body = $self->json->encode({ data => $self->data });
	} elsif (%data) {
		warn 'Request includes %data but is a GET request';
	}
	my $request = HTTP::Request->new(
		$self->method,
		$uri,
		\@headers,
		defined $body ? $body : (),
	);
	$request->authorization_basic($self->api_key,"");

	# use DDP;
	# p($self->method);
	# p($uri);
	# p($body);

	# p(%data);
	# p(@params);
	# p($request->uri->as_string);
	# p($request->content);

	return $request;
}

1;

__END__
=pod

=head1 NAME

WWW::Asana::Request - Asana Request Class

=head1 VERSION

version 0.003

=head1 AUTHOR

Torsten Raudssus <torsten@raudss.us>

=head1 COPYRIGHT AND LICENSE

This software is copyright (c) 2012 by Torsten Raudssus.

This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.

=cut