The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl

use strict;
use Test::More tests => 18;
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', 18 if $api_key eq '';

	my $client_id = $cm->account_clients()->{response}->[0]->{ClientID};
	my $list_id   = $cm->client_lists($client_id)->{response}->[0]->{ListID};

	my %campaign = (
		  'ListIDs' => [ $list_id, ],
		  'FromName' => 'My Name',
		  'TextUrl' => 'http://media.netcomm.com.au/public/assets/file/0003/70833/full_width.html',
		  'Subject' => 'My Subject',
		  'HtmlUrl' => 'http://media.netcomm.com.au/public/assets/file/0003/70833/full_width.html',
		  'SegmentIDs' => [],
		  'FromEmail' => 'myemail@mydomain.com',
		  'Name'      => 'My Campaign Name'.time,
		  'ReplyTo'   => 'myemail@mydomain.com',
		  'clientid'  => $client_id
		);

	my $created_campaign = $cm->campaigns(%campaign);

	ok( $created_campaign->{code} eq '201', 'Draft campaign created' );

	my $campaign_id = $created_campaign->{response};

	my %campaign_schedule = (
		  'SendDate'          => '2016-01-01',
		  'ConfirmationEmail' => 'myemail@example.com',
		  'campaignid'        => $campaign_id
	);

	my %campaign_unschedule = (
		  'campaignid'        => $campaign_id
	);

	my %campaign_send = (
		  'SendDate'          => 'Immediately',
		  'ConfirmationEmail' => 'myemail@example.com',
		  'campaignid'        => $campaign_id
	);

	my %campaign_sendpreview = (
		  'PreviewRecipients' => [
					   'test1@example.com',
					   'test2@example.com'
					 ],
		  'Personalize'       => 'Random',
		  'campaignid'        => $campaign_id
	);

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

	my %paging_info_date = (
		'date'           => '1900-01-01',
		'page'           => '1',
		'pagesize'       => '100',
		'orderfield'     => 'email',
		'orderdirection' => 'asc',
		'campaignid'     => $campaign_id,
	);

	ok( $cm->campaigns_send(%campaign_schedule)->{code} eq '200', 'Campaign scheduled' );
	ok( $cm->campaigns_unschedule(%campaign_unschedule)->{code} eq '200', 'Campaign unscheduled' );
	ok( $cm->campaigns_send(%campaign_send)->{code} eq '200', 'Campaign sent' );
	ok( $cm->campaigns_sendpreview(%campaign_sendpreview)->{code} eq '200', 'Campaign send previews' );
	ok( $cm->campaigns_summary($campaign_id)->{code} eq '200', 'Campaign summary' );
	ok( $cm->campaigns_emailclientusage($campaign_id)->{code} eq '200', 'Campaign email client usage' );
	ok( $cm->campaigns_listsandsegments($campaign_id)->{code} eq '200', 'Campaign lists and segments' );
	ok( $cm->campaigns_recipients(%paging_info)->{code} eq '200', 'Campaign recipients' );
	ok( $cm->campaigns_bounces(%paging_info)->{code} eq '200', 'Campaign bounces' );
	ok( $cm->campaigns_opens(%paging_info_date)->{code} eq '200', 'Campaign opens' );
	ok( $cm->campaigns_clicks(%paging_info_date)->{code} eq '200', 'Campaign clicks' );
	ok( $cm->campaigns_unsubscribes(%paging_info_date)->{code} eq '200', 'Campaign unsubscribes' );
	ok( $cm->campaigns_spam(%paging_info_date)->{code} eq '200', 'Campaign spam complaints' );
	ok( $cm->campaigns_delete($campaign_id)->{code} eq '200', 'Campaign deleted' );
	
	# Create a campaign using the template created in 07_templates.t
	my $template_id = $cm->client_templates($client_id)->{'response'}->[0]->{TemplateID};
  my $template_content = {
    'Singlelines' => [
      {
        'Content' => "This is a heading",
        'Href' => "http://example.com/"
      }
    ],
    'Multilines' => [
      {
        'Content' => "<p>This is example</p><p>multiline <a href=\"http://example.com\">content</a>...</p>"
      }
    ],
    'Images' => [
      {
        'Content' => "https://dl.dropbox.com/u/884452/cm/perl/images/one.jpg",
        'Alt' => "This is alt text for an image",
        'Href' => "http://example.com/"
      }
    ],
    'Repeaters' => [
      {
        'Items' => [
          {
            'Layout' => "My layout",
            'Singlelines' => [
              {
                'Content' => "This is a repeater heading",
                'Href' => "http://example.com/"
              }
            ],
            'Multilines' => [
              {
                'Content' => "<p>This is example</p><p>multiline <a href=\"http://example.com\">content</a>...</p>"
              }
            ],
            'Images' => [
              {
                'Content' => "https://dl.dropbox.com/u/884452/cm/perl/images/two.jpg",
                'Alt' => "This is alt text for a repeater image",
                'Href' => "http://example.com/"
              }
            ]
          }
        ]
      }
    ],
  };

  my %campaign_fromtemplate = (
    'clientid'         => $client_id,
    'Name'             => 'Campaign from template',
    'Subject'          => 'Campaign from template',
    'FromName'         => 'My Name',
    'FromEmail'        => 'myemail@mydomain.com',
    'ReplyTo'          => 'myemail@mydomain.com',
    'ListIDs'          => [ $list_id, ],
    'SegmentIDs'       => [],
    'TemplateID'      => $template_id,
    'TemplateContent' => $template_content,
  );
  my $created_template_campaign = $cm->campaigns_fromtemplate(%campaign_fromtemplate);
  my $template_campaign_id = $created_template_campaign->{response};

  ok( $created_template_campaign->{code} eq '201', 'Template-based campaign created' );
  ok( $cm->campaigns_delete($template_campaign_id)->{code} eq '200', 'Template-based campaign deleted' );
  ok( $cm->templates_delete($template_id)->{code} eq '200', 'Deleted template used in campaign' );
}