#!/usr/bin/perl
#
# we cannot sent more then 2 sms a minute

use strict;
use IO::Socket::INET;
use Data::Dumper;
use Log::Log4perl "get_logger";

# LOGS -------------------------
my $LOG_CFG_FILENAME  = "$ENV{APL}/common/etc/logger_sms.conf"; # logger settings config file
my $LOG_CFG_REFRESH_INTERVAL = 60;                         # logger config refresh interval
Log::Log4perl::init_and_watch($LOG_CFG_FILENAME, $LOG_CFG_REFRESH_INTERVAL);
my $log               = get_logger('SMS');

# CONS -------------------------
my $sms_sierra="192.168.22.5:17341";  #IP:port of sierra device
my $sms_out="$ENV{APL_VAR}/sms/out";
my $sms_sent="$ENV{APL_VAR}/sms/sent";
my $sms_err="$ENV{APL_VAR}/sms/err";
my %sms_scenarios=(
		MANUAL		 	=>'T=SOS,S=0',
		OFFLOAD_DATA	 	=>'T=SOS,S=1',
		CONSERVE_BATTERY 	=>'T=SOS,S=2',
		CONSERVE_BATTERY_MWS	=>'T=SOS,S=3',
		STAY_ON		 	=>'T=SOS,S=4',
		STAY_OFF	 	=>'T=SOS,S=5');
my %sms_actions=(
		WAKEUP		=>'T=SCM,M=WU:600',
		REBOOT_OLD	=>'T=SCM,M=RST:PDVR,PRAD',
		FUEL_CUT	=>'T=SMC,OUT:(FCUT=1)',
		FUEL_ON		=>'T=SMC,OUT:(FCUT=0)',
                SHUTDOWN	=>'T=SMC,OUT:(PRAD=0,PDVR=0)',
		RESET		=>'T=SCM,M=RST',
		REBOOT		=>'T=SCM,M=REBOOT',
		STATUS		=>'T=SSR,R=GSU',
                SLEEP		=>'T=SMC,OUT:(PDVR=0,PMW=0,PRAD=0)');
my %sms_respond=(
                RESPOND		=>'T=RGW,M=');

# SUBS -------------------------
sub sms2socket {
    my $msg=shift;
    my $reply;
    my $try = 3;
    my $socket = new IO::Socket::INET (
       PeerAddr   => $sms_sierra,
       Proto      => 'udp'
    ) or die "ERROR in Socket Creation : $!\n";
    for(;;){
       print "sending..\n";
       $socket->send($msg);
       $socket->recv($reply,20);
       $log->info("reply=$reply");
       last if $reply=~/ACK0ACK/ || $try-- < 1 ; 
       $log->info("retrying...");
       sleep(30);
    }
    return 'SUCCESS' if  $reply eq 'ACK0ACK';
    return $reply;
}

sub send_sms {
    my $file=shift;
    open(SMS,"$sms_out/$file");
    my %vars=map{/(^\w+)=(.+)/} grep {/^\w+=.+/} <SMS>;
    close SMS;
    $log->info(Dumper(\%vars));
    my ($id,$mess);
    if(exists $vars{SCENARIO}) {
       $id=$vars{SCENARIO};
       $mess=$sms_scenarios{$id};
    }elsif(exists $vars{ACTION}) {
       $id=$vars{ACTION};
       $mess=$sms_actions{$id}; 
    }elsif(exists $vars{RESPOND}) {
       $mess=$sms_respond{RESPOND}.$vars{RESPOND};
    }else {
       $log->warn("SCENARIO & ACTION are missing, ignore message");
       unlink "$sms_out/$file";
       return;
    }
    $log->info("$id:$mess");
    my $code=join('',map {sprintf("%02x",ord($_))} split(//,$mess));
    my $msg="<<<$vars{TELEPHONE_NUMBER},ASCII,".length($mess).",$code>>>";
    $log->info("$msg");
    if(sms2socket($msg) eq 'SUCCESS') {
       rename("$sms_out/$file","$sms_sent/$file"); 
    }else { # FAIL
       rename("$sms_out/$file","$sms_err/$file"); 
    }
    sleep 20;
}

# MAIN ================================
$log->info("SMSOUT started");
for(;;) {
   opendir(DIR,$sms_out) || die "Cannot read directory $sms_out";
   my @files= sort grep {/^\d+\.\d+$/}readdir(DIR);
   closedir(DIR);
   foreach my $sms (@files) {
     send_sms($sms); 
   }
   $log->debug("sleep 2..");
   sleep 2;
}


