#!/usr/bin/perl

#
# Load some modules
use GSM::SMS::Config;
use GSM::SMS::NBS;
use Getopt::Long;
use Log::Agent;
require Log::Agent::Driver::File;

#
# No output buffering
$|++;



#
# Arguments
my $ARG_CONFIG;
my $ARG_TRANSPORTCONFIG;
my $ARG_VERBOSE;
GetOptions( 
	"config=s" => \$ARG_CONFIG,
	"transportconfig:s" => \$ARG_TRANSPORTCONFIG,
	"verbose" => \$ARG_VERBOSE	
 );

unless ( $ARG_CONFIG ) {
print <<EOT;
Usage: $0 --config=<config file> [--transportconfig=<transport config file>] [--verbose]
EOT
exit(1);
}


#
# Read & process sms config file
my $config = {};
open CFG, $ARG_CONFIG or die "Can't read sms config file: $ARG_CONFIG!\n";
while (<CFG>) {
	chomp;
	s/#.*//;
	s/^\s+//;
	s/\s+$//;
	next unless length;
	my ($var, $value) = split(/\s*=\s*/, $_, 2);
	$config->{$var} = $value;
}
close CFG;
my $CFG_LOG = $config->{"log"};
my $CFG_LOGLEVEL = $config->{"loglevel"};
my $CFG_GROUPGFXDIR = $config->{"groupgraphicdir"};
my $CFG_GROUPGFXPREFIX = $config->{"groupgraphicprefix"};
my $CFG_RTTTLDIR = $config->{"rtttldir"};
my $CFG_RTTTLPREFIX = $config->{"rtttlprefix"};
my $CFG_ACL = $config->{"access"};
my @CFG_ACL = split /,/, $CFG_ACL;

verb(<<EOT
SMART MESSAGING SERVER

coming up with settings:
 transportconfig              $ARG_TRANSPORTCONFIG
 log                          $CFG_LOG
 loglevel                     $CFG_LOGLEVEL
 groupgraphicdir              $CFG_GROUPGFXDIR
 groupgraphicprefix           $CFG_GROUPGFXPREFIX
 rtttldir                     $CFG_RTTTLDIR
 rtttlprefix                  $CFG_RTTTLPREFIX
 acl                          $CFG_ACL

EOT
);



#
# Initialize
if ( $CFG_LOG ne "" ) {
	logconfig( 	-level	=> $CFG_LOGLEVEL,
				-driver =>
		Log::Agent::Driver::File->make(
			-prefix			=> $0,
			-showpid		=> 1,
			-channels		=> {
				'error'		=> "$CFG_LOG/$0.err",
				'output'	=> "$CFG_LOG/$0.out",
				'debug'		=> "$CFG_LOG/$0.dbg"
			},
		)
	);
}

if ( $CFG_LOG eq "" && $CFG_LOGLEVEL ne "" ) {
	logconfig( -level => $CFG_LOGLEVEL );
}

my $nbs = GSM::SMS::NBS->new( $ARG_TRANSPORTCONFIG );

my $msisdn;
my $message;
my $timestamp;
my $transportname;
my $port;

#
# Start server ...
while (1) {
	verb( "waiting for message ..." );
	# blocking receive
	$nbs->receive(	\$msisdn, 
			\$message, 
			\$timestamp, 
			\$transportname, 
			\$port, 
			1 );	
	
	verb(<<EOT

received a message:
msisdn:        $msisdn
timestamp:     $timestamp
transport:     $transportname
port:          $port
--------------------------------------------------------------------------
$message
--------------------------------------------------------------------------
EOT
);
	# only text messages
	unless ( $port ) {
		# acl check
		if ( grep { $msisdn =~ /$_/ } @CFG_ACL ) {
			verb( "acl pass\n" );	
			$message =~ /(\d{2})(\d{4})/;
			my $prefix = $1;
			my $resource = $2;
	
			# handle ringing tones	
			if ( $prefix eq $CFG_RTTTLPREFIX ) {
				verb( "rtttl\n" );
				my $file = $CFG_RTTTLDIR . '/' . $resource . '.rtttl';
				verb( "file $file " );
				if ( -e $file ) {
					verb( "is a valid resource!\n" );	
					local (*F);
					open F, $file;
					my $rtttl_string = join "", <F>;
					
					close F;
					$nbs->sendRTTTL( $msisdn, $rtttl_string );
					logsay( sprintf("\"$message\"\t\"$msisdn\"") ); 
				}
			} 

			# handle group graphics
 			if ( $prefix eq $CFG_GROUPGFXPREFIX ) {
				verb( "groupgfx\n" );
				my $file = $CFG_GROUPGFXDIR . '/' . $resource . '.gif';
				verb( "file $file " );
				if ( -e $file ) {
					verb( "is a valid resource!\n" ); 
					$nbs->sendGroupGraphic_file( $msisdn, $file );
					logsay( sprintf("\"$message\"\t\"$msisdn\"") ); 
				}
			}
		}
	}
	verb( "\n" );
}
exit(0);

#
# Verbose function
sub verb {
	print shift if $ARG_VERBOSE;
}
