#!perl

use strict;
use warnings;

use Test::More;
use Test::LWP::UserAgent;

use JSON;
use HTTP::Body;
use HTTP::Response;
use File::Temp;

use Pinto::Remote;
use Pinto::Globals;
use Pinto::Constants qw($PINTO_DEFAULT_COLORS);

#-----------------------------------------------------------------------------

{

    local $ENV{PINTO_COLORS} = undef;
    my $ua = local $Pinto::Globals::UA = Test::LWP::UserAgent->new;

    my $res = HTTP::Response->new(200);
    $ua->map_response( qr{.*} => $res );

    my $action      = 'Add';
    my $temp        = File::Temp->new;
    my %pinto_args  = ( username => 'myname' );
    my %chrome_args = ( verbose => 2, no_color => 1, quiet => 0, colors => $PINTO_DEFAULT_COLORS );
    my %action_args = ( archives => [ $temp->filename ], author => 'ME', stack => 'mystack' );

    my $chrome = Pinto::Chrome::Term->new(%chrome_args);
    my $pinto = Pinto::Remote->new( root => 'myhost', chrome => $chrome, %pinto_args );
    $pinto->run( $action, %action_args );

    my $req = $ua->last_http_request_sent;

    is $req->method, 'POST', "Correct HTTP method in request for action $action";

    is $req->uri, 'http://myhost:3111/action/add', "Correct uri in request for action $action";

    my $req_params      = parse_req_params($req);
    my $got_chrome_args = decode_json( $req_params->{chrome} );
    my $got_pinto_args  = decode_json( $req_params->{pinto} );
    my $got_action_args = decode_json( $req_params->{action} );

    is_deeply $got_chrome_args, \%chrome_args, "Correct chrome args in request for action $action";

    is_deeply $got_pinto_args, \%pinto_args, "Correct pinto args in request for action $action";

    is_deeply $got_action_args, \%action_args, "Correct action args in request for action $action";
}

#-----------------------------------------------------------------------------

sub parse_req_params {
    my ($req)  = @_;
    my $type   = $req->headers->header('Content-Type');
    my $length = $req->headers->header('Content-Length');
    my $hb = HTTP::Body->new( $type, $length );
    $hb->add( $req->content );
    return $hb->param;
}

#-----------------------------------------------------------------------------

done_testing;
