#!/usr/bin/perl -w

use strict;
use English;
use Getopt::Long;
use LWP;
use Switch;
use HTTP::Request;
sub print_help ();
sub print_usage ();


my ($opt_h, $opt_t, $opt_r, $opt_f, $opt_k) = "";
my ($result, $response);

my $PROGNAME="smd_sms";

Getopt::Long::Configure('bundling');
GetOptions(
        "h"   => \$opt_h, "help"        => \$opt_h,
        "r=s" => \$opt_r, "recipient"        => \$opt_r,
        "f=s" => \$opt_f, "from"        => \$opt_f,
        "t=s" => \$opt_t, "text"        => \$opt_t,
        "k=s" => \$opt_k, "key"        => \$opt_k,        
        );

if (($opt_h) || ($opt_r eq "" || $opt_f eq "" || $opt_t eq ""|| $opt_k eq ""  )){
        #
        print_help();
        exit;
}

print "recipient: " . $opt_r ."\n";
print "sender: " . $opt_f ."\n";
print "text: " . $opt_t ."\n";
print "key: " . $opt_k ."\n";

my $browser = LWP::UserAgent->new;
my $url = 'http://gateway.mobilant.net/?';
#my $url = 'http://www.ndfnet.de/';

my $ua = LWP::UserAgent->new;
$ua->timeout(10);
$ua->env_proxy;

$response = $ua->get($url . "key=" . escape($opt_k) . "&handynr=".  escape($opt_r) ."&kennung=" . escape($opt_f) ."&text=". escape($opt_t) ."&service=fast");

if (($response->content == 100) && ($response->is_success)) {
        print "sms send!";
} else {
        print "sms not send - Error: " . get_error($response->content);
}

# URL-encode data
sub escape {
    shift() if ref($_[0]);
    my $toencode = shift;
    return undef unless defined($toencode);
    $toencode=~s/([^a-zA-Z0-9_.-])/uc sprintf("%%%02x",ord($1))/eg;
    return $toencode;
}

# unescape URL-encoded data
sub unescape {
    shift() if ref($_[0]);
    my $todecode = shift;
    return undef unless defined($todecode);
    $todecode =~ tr/+/ /;       # pluses become spaces
    $todecode =~ s/%([0-9a-fA-F]{2})/pack("c",hex($1))/ge;
    return $todecode;
}

sub print_usage () {
        print "Usage:\n";
        print "  $PROGNAME -r recieptnr -f sendernr -t text -k key\n";
        print "  $PROGNAME [-h | --help]\n";
}

sub print_help () {
        print "Copyright (c) 2008 Andreas Roth\n\n";
        print_usage();
        print "\n";
        print "  <recieptnr>  nr. for sms send to\n";
        print "  <sendernr>  nr sms was send from\n";
        print "  <text>  message in SMS\n";
        print "  <key>  valid key generated by account\n";
        print "\n";
}

sub get_error {

        my $errorcode = shift ;
        
        switch ($errorcode)  {
        case 200   {    return "Handy Nummer im falschen Format"; }
        case 201   {    return "ung&uuml;ltiges Absenderformat - Sonderzeichen"; }
        case 300   {    return "Zuwenig Guthaben zur Ausführung vorhanden"; }
        case 400   {    return "Carrier Zustellung misslungen"; }
        case 500   {    return "Zustellung verweigert. Accountlimit überschritten."; }
        case 600   {    return "Tagelimit überschritten"; }
        case 700   {    return "Monatslimit überschritten"; }
        case 800   {    return "Falsche IP"; }
        case 900   {    return "Handy Nummer gesperrt"; }
        case 1000   {     return "SMS zu lang; Limit von 1600 Zeichen überstiegen"; }
        case 1100   {     return "0190er Werbung ohne Preisangabe - Zustellung blockiert"; }
        case 1200   {     return "Mehr als 11 SMS an denselben Empfänger - Zustellung blockiert"; }
        case 1300   {     return "MMS   Gesamtgröße von 25 kb überschritten"; }
        case 1401   {     return "MMS   Bild 1 hat falsches Format oder URL ist falsch"; }
        case 1402   {     return "MMS   Bild 2 hat falsches Format oder URL ist falsch"; }
        case 1403   {     return "MMS   Bild 3 hat falsches Format oder URL ist falsch"; }
        case 1403   {     return "MMS hat maximale Zeichenlaenge von 500 Zeichen ueberschritten!"; }
        case 1600   {     return "Massenversand   {Keine Nummern angegeben"; }
        case 1700   {     return "Interner Massenversandfehler. Technik verständigt"; }
        else {
                return "unknown error";
        }
        }
}