#!/usr/bin/perl

use strict;
use warnings;

use Test::Most;

if ( !$ENV{WPP_TEST} || !-f $ENV{WPP_TEST} ) {
    plan skip_all =>
        'No WPP_TEST env var set. Please see README to run tests';
}
else {
    plan tests => '7';
}

use Business::PayPal::API
    qw( DirectPayments CaptureRequest ReauthorizationRequest VoidRequest RefundTransaction );

my @methlist
    = qw( DirectPayments CaptureRequest ReauthorizationRequest VoidRequest RefundTransaction);
use_ok( 'Business::PayPal::API', @methlist );

require 't/API.pl';

my %args = do_args();

my ( $transale, $tranvoid, $tranbasic, $tranrefund );
my ( $ppsale, $ppvoid, $ppbasic, $pprefund, $pprefund1, $ppcap, $ppcap1 );
my (%respsale, %resprefund, %resprefund1, %respbasic,
    %respcap,  %respcap1,   %respvoid
);

#Test Full Refund on Sale

#$Business::PayPal::API::Debug=1;
$ppsale   = new Business::PayPal::API( %args );
%respsale = $ppsale->DoDirectPaymentRequest(
    PaymentAction     => 'Sale',
    OrderTotal        => 11.87,
    TaxTotal          => 0.0,
    ItemTotal         => 0.0,
    CreditCardType    => 'Visa',
    CreditCardNumber  => '4561435600988217',
    ExpMonth          => '01',
    ExpYear           => +( localtime )[5] + 1901,
    CVV2              => '123',
    FirstName         => 'JP',
    LastName          => 'Morgan',
    Street1           => '1st Street LaCausa',
    Street2           => '',
    CityName          => 'La',
    StateOrProvince   => 'CA',
    PostalCode        => '90210',
    Country           => 'US',
    Payer             => 'mall@example.org',
    CurrencyID        => 'USD',
    IPAddress         => '10.0.0.1',
    MerchantSessionID => '10113301',
);

#$Business::PayPal::API::Debug=0;
if ( like( $respsale{'Ack'}, qr/Success/, 'Direct Payment Sale' ) ) {
    $transale = $respsale{'TransactionID'};

    #$Business::PayPal::API::Debug=1;
    $pprefund   = new Business::PayPal::API( %args );
    %resprefund = $pprefund->RefundTransaction(
        TransactionID => $transale,
        RefundType    => 'Full',
        Memo          => 'Full direct sale refund',
    );

    #$Business::PayPal::API::Debug=0;
    like( $resprefund{'Ack'}, qr/Success/, 'Full Refund For Sale' );
}

#Basic Authorization and Capture

%args = do_args();

#$Business::PayPal::API::Debug=0;
$ppbasic   = new Business::PayPal::API( %args );
%respbasic = $ppbasic->DoDirectPaymentRequest(
    PaymentAction     => 'Authorization',
    OrderTotal        => 13.87,
    TaxTotal          => 0.0,
    ItemTotal         => 0.0,
    CreditCardType    => 'Visa',
    CreditCardNumber  => '4561435600988217',
    ExpMonth          => '01',
    ExpYear           => +( localtime )[5] + 1901,
    CVV2              => '123',
    FirstName         => 'JP',
    LastName          => 'Morgan',
    Street1           => '1st Street LaCausa',
    Street2           => '',
    CityName          => 'La',
    StateOrProvince   => 'CA',
    PostalCode        => '90210',
    Country           => 'US',
    Payer             => 'mall@example.org',
    CurrencyID        => 'USD',
    IPAddress         => '10.0.0.1',
    MerchantSessionID => '10113301',
);

#$Business::PayPal::API::Debug=0;
if (like(
        $respbasic{'Ack'}, qr/Success/,
        'Direct Payment Basic Authorization'
    )
    )
{
    $tranbasic = $respbasic{'TransactionID'};

    #Test Partial Capture
    #$Business::PayPal::API::Debug=1;
    $ppcap = new Business::PayPal::API( %args );

    %respcap = $ppcap->DoCaptureRequest(
        AuthorizationID => $tranbasic,
        CompleteType    => 'NotComplete',
        Amount          => '3.00',
        Note            => 'Partial Capture',
    );

    #$Business::PayPal::API::Debug=0;
    like( $respcap{'Ack'}, qr/Success/, 'Partial Capture' );

    #Test Full Capture
    #$Business::PayPal::API::Debug=1;
    $ppcap1   = new Business::PayPal::API( %args );
    %respcap1 = $ppcap1->DoCaptureRequest(
        AuthorizationID => $tranbasic,
        CompleteType    => 'Complete',
        Amount          => '6.00',
    );

    #$Business::PayPal::API::Debug=0;
    like( $respcap1{'Ack'}, qr/Success/, 'Full Capture' );
}
else { skip( "direct payment auth failed", 2 ) }

#Test Void
$ppbasic   = new Business::PayPal::API( %args );
%respbasic = $ppbasic->DoDirectPaymentRequest(
    PaymentAction     => 'Authorization',
    OrderTotal        => 17.37,
    TaxTotal          => 0.0,
    ItemTotal         => 0.0,
    CreditCardType    => 'Visa',
    CreditCardNumber  => '4561435600988217',
    ExpMonth          => '01',
    ExpYear           => +( localtime )[5] + 1901,
    CVV2              => '123',
    FirstName         => 'JP',
    LastName          => 'Morgan',
    Street1           => '1st Street LaCausa',
    Street2           => '',
    CityName          => 'La',
    StateOrProvince   => 'CA',
    PostalCode        => '90210',
    Country           => 'US',
    Payer             => 'mall@example.org',
    CurrencyID        => 'USD',
    IPAddress         => '10.0.0.1',
    MerchantSessionID => '10113301',
);

#$Business::PayPal::API::Debug=1;
$ppvoid   = new Business::PayPal::API( %args );
%respvoid = $ppvoid->DoVoidRequest(
    AuthorizationID => $respbasic{TransactionID},
    Note            => 'Authorization Void',
);

#$Business::PayPal::API::Debug=0;
like( $respvoid{'Ack'}, qr/Success/, 'Authorization Voided' );