package SMS::Send::BulkSMS;

use strict;
use warnings;

$SMS::Send::BulkSMS::VERSION = '0.01';

# ABSTRACT: SMS::Send driver for the International BulkSMS service

use Carp;
use HTTP::Tiny;

use base 'SMS::Send::Driver';

sub new {
    my ($class, %args) = @_;
    my $self = \%args;

    $self->{$_}
        or croak "$_ missing"
            for qw( _login _password );

    $self->{_http} = HTTP::Tiny->new();

    $self->{_verbose} = 0 unless exists $self->{_verbose};

    return bless $self, $class;
}

sub send_sms {
    my ($self, %args) = @_;

    # remove leading +
    ( my $recipient = $args{to} ) =~ s/^\+//;

    my $message = $args{text};

    my $response = $self->{_http}->post_form(
        'https://bulksms.vsms.net/eapi/submission/send_sms/2/2.0',
        {
            username     => $self->{_login},
            password     => $self->{_password},
            msisdn       => $recipient,
            message      => $message,
        },
    );

    # Fatal error
    croak $response->{content}
        unless $response->{success};
        
    my ($result_code, $result_string, $batch_id) = split(/\|/, $response->{content});

    if ($result_code eq '0') {
        warn "send_sms succeeded: $batch_id" if $args{_verbose};
        return 1;
    }
    else {
        warn "send_sms failed: $result_code, $result_string" if $args{_verbose};
        return 0;
    }
    print "\n";

    croak "Can't parse response from BulkSMS API";
}

1;

__END__

=pod

=encoding UTF-8

=head1 NAME

SMS::Send::BulkSMS - SMS::Send driver for the International BulkSMS service

=head1 VERSION

version 0.01

=head1 SYNOPSIS

    use SMS::Send;
    my $sender = SMS::Send->new('BulkSMS',
        _login    => 'foo',
        _password => 'bar',
    );

    my $sent = $sender->send_sms(
        'text'    => 'This is a test message',
        'to'      => '+55 (19) 1234 5678',
    );

    # Did the send succeed.
    if ( $sent ) {
        print "Message sent ok\n";
    } else {
        print 'Failed to send message\n";
    }

=head1 DESCRIPTION

This module currently uses the L<HTTP API|http://www.bulksms.com/>.

=head1 METHODS

=head2 send_sms

It is called by L<SMS::Send/send_sms> and passes all arguments starting with an
underscore to the request having the first underscore removed as shown in the
SYNOPSIS above.

It returns a boolean value telling if the message was successfully sent or not.

It throws an exception if a fatal error like a http timeout in the underlying
connection occurred.

=head1 AUTHOR

Mario Celso Teixeira <marioct37@gmail.com>

=head1 COPYRIGHT AND LICENSE

This software is copyright (c) CPqD 2016 by Mario Celso Teixeira.

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
