#!/usr/bin/perl

use strict;
use Test::More tests => 23;
use Net::CampaignMonitor;
use Params::Util qw{_STRING};

my $api_key = '';
my $cm;

if ( Params::Util::_STRING($ENV{'CAMPAIGN_MONITOR_API_KEY'}) ) {
  $api_key = $ENV{'CAMPAIGN_MONITOR_API_KEY'};
  $cm = Net::CampaignMonitor->new({
    secure  => 1,
    api_key => $api_key,
    domain => (defined($ENV{'CAMPAIGN_MONITOR_DOMAIN'}) ?
      $ENV{'CAMPAIGN_MONITOR_DOMAIN'} : 'api.createsend.com'),
  });
}

SKIP: {
	skip 'Invalid API Key supplied', 23 if $api_key eq '';

	my %new_client = (
		'CompanyName'  => "ACME Limited",
		'Country'      => "Australia",
		'TimeZone'     => "(GMT+10:00) Canberra, Melbourne, Sydney"
	);

	my $created_client = $cm->account_clients(%new_client);

	ok( $created_client->{'code'} eq '201', 'Client created' );

	my $client_id = $created_client->{'response'};

	my %basic_access_settings = (
		'AccessLevel' => '23',
		'clientid'    => $client_id,
	);

	my %access_settings = (
		'AccessLevel' => '23',
		'Username'    => 'jdoe',
		'Password'    => 'password',
		'clientid'    => $client_id,
	);

	my %paging_info = (
		'page'           => '1',
		'pagesize'       => '100',
		'orderfield'     => 'email',
		'orderdirection' => 'asc',
		'clientid'       => $client_id,
	);

	my %replace_client = (
		'CompanyName'  => "ACME Limited",
		'Country'      => "Australia",
		'TimeZone'     => "(GMT+10:00) Canberra, Melbourne, Sydney",
		'clientid'     => $client_id
	);

	my %payg = (
		'Currency'               => 'AUD',
		'CanPurchaseCredits'     => 'false',
		'ClientPays'             => 'true',
		'MarkupPercentage'       => '20',
		'MarkupOnDelivery'       => '5',
		'MarkupPerRecipient'     => '4',
		'MarkupOnDesignSpamTest' => '3',
		'clientid'               => $client_id,
	);

	my %credits = (
		'Credits'                       => '0',
		'CanUseMyCreditsWhenTheyRunOut' => 'true',
		'clientid'                      => $client_id,
	);

	my %monthly = (
		'Currency'               => 'AUD',
		'ClientPays'             => 'true',
		'MarkupPercentage'       => '20',
		'clientid'               => $client_id,
	);

  my %listsforemail = (
    'email' => 'example@example.com',
    'clientid' => $client_id,
  );

  my %suppress = (
    'EmailAddresses' => [ 'example123@example.com', 'example456@example.com' ],
    'clientid' => $client_id,
  );

  my %unsuppress = (
    'email' => 'example123@example.com',
    'clientid' => $client_id,
  );

	ok( $cm->client_clientid($client_id)->{code} eq '200', 'Got client details' );
	ok( $cm->client_campaigns($client_id)->{code} eq '200', 'Got client sent campaigns' );
	ok( $cm->client_drafts($client_id)->{code} eq '200', 'Got client draft campaigns' );
	ok( $cm->client_scheduled($client_id)->{code} eq '200', 'Got client scheduled campaigns' );
	ok( $cm->client_lists($client_id)->{code} eq '200', 'Got client subscriber lists' );
	ok( $cm->client_listsforemail(%listsforemail)->{code} eq '200', 'Got client lists for an email address' );
	ok( $cm->client_segments($client_id)->{code} eq '200', 'Got client segments' );
	ok( $cm->client_suppressionlist(%paging_info)->{code} eq '200', 'Got client suppression list' );
	ok( $cm->client_templates($client_id)->{code} eq '200', 'Got client templates' );
	ok( $cm->client_setbasics(%replace_client)->{code} eq '200', 'Set client basics' );
	ok( $cm->client_setpaygbilling(%payg)->{code} eq '200', 'Set client PAYG billing' );
	ok( $cm->client_transfercredits(%credits)->{code} eq '200', 'Transferred credits to client' );
	ok( $cm->client_setmonthlybilling(%monthly)->{code} eq '200', 'Set client monthly billing' );
	ok( $cm->client_suppress(%suppress)->{code} eq '200', 'Suppressed email addresses' );
	ok( $cm->client_unsuppress(%unsuppress)->{code} eq '200', 'Unsuppressed an email address' );

	my %new_person = (
		'clientid'     	=> $client_id,
		'EmailAddress'  => "joe.person\@example.com",
		'Name'          => "Joe Doeman",
		'AccessLevel'   => 23,
		'Password'      => "safepassword"
	);

	my %update_person = (
		'clientid'      => $client_id,
		'email'         => "joe.person\@example.com",
		'EmailAddress'  => "joe.new\@example.com",
		'Name'          => "Joe Doeman",
		'AccessLevel'   => 23,
		'Password'      => "safepassword"
	);

	my %person = (
		'clientid'      => $client_id,
		'email'         => "joe.new\@example.com",
	);

	my %another_person = (
		'clientid'     	=> $client_id,
		'EmailAddress'  => "another.person\@example.com",
		'Name'          => "Another Person",
		'AccessLevel'   => 23,
		'Password'      => "safepassword"
	);

	my %delete_person = (
		'clientid'      => $client_id,
		'email'         => "another.person\@example.com",
	);

	ok( $cm->client_addperson(%new_person)->{code} eq '201', 'Added new person' );
	ok( $cm->client_updateperson(%update_person)->{code} eq '200', 'Updated person' );
	ok( $cm->client_getpeople($client_id)->{code} eq '200', 'Got people' );
	ok( $cm->client_getperson(%person)->{code} eq '200', 'Got person' );
	ok( $cm->client_getprimarycontact($client_id)->{code} eq '200', 'Got person primary contact' );
	ok( $cm->client_addperson(%another_person)->{code} eq '201', 'Added new person' );
	ok( $cm->client_deleteperson(%delete_person)->{code} eq '200', 'Delete person' );
}