#!/usr/bin/perl -w
#


BEGIN {
	push(@INC, "../CTPort/");
};

use CTPort;
use POSIX;
use IO::Handle;

sub slave_loop();
sub logger($);
sub procargs(@);
sub daemonize($);
sub do_pickup_thing();
sub do_ring_thing();


my $port=1208;
my $testcount=0;
my $daemon=0;
my $ctport;
my $event_source;
my $suscount=0;

procargs(@ARGV);
my $logfile="log/$port-slave.log";
open (LOGFILE,">>$logfile");
autoflush LOGFILE 1;
daemonize($daemon);

logger("STARTUP: Connecting to CTServer on port $port.");
$ctport = new Telephony::CTPort($port);
$hold_party = "";

slave_loop();

exit;


sub slave_loop(){
	while(1) {
		$ctport->clear();
		$hold_party="";
		logger("SLAVE LOOP");
		$ctport->unset_event_handler("incoming call");
		($event_source,$event) = $ctport->wait_for_event(); 
		logger("SLAVE LOOP[event]:$event");

		if ($event eq "pickup") {
			logger("SLAVE LOOP: Outbound call coming through!");
			do_pickup_thing();
		}
		elsif ($event eq "ring") {
			logger("SLAVE LOOP: Im being called!! Ring Ring");
			do_ring_thing();
		}
	}
}

sub do_pickup_thing(){
	my $dig = $ctport->collect(1,20);
	logger("PickUpThing: Got digit [$dig]");
	if ($dig eq "1" ){
		$ctport->dial("6");	
	}
	elsif ($dig eq "2"){
		$ctport->dial("7");	
	}
	elsif ($dig eq "3"){
		$ctport->dial("8");	
	}
	elsif ($dig eq "4"){
		$ctport->dial("9");	
	}
	elsif ($dig eq "5"){
		$ctport->dial("0");	
	}
	else {
		$ctport->dial("*");	
	}
	return;
}

sub do_ring_thing(){
	sleep 2;
	$ctport->off_hook();
	logger("Slave: Off Hook");
	sleep 2;
	my $foo=1;
	my $dig="foobart";
	my $dropout=0;
	while($foo){
		logger("Slave: Dial 1");
		$ctport->dial("1");
		$ctport->clear();
		$dig = $ctport->collect(1,5);
		logger("Slave: Got digit [$dig]");
		$dropout++;
		if ($dig eq "6"){
			$suscount++;
			logger("Slave: Success ($suscount)");
			$foo=0;
		}
		if ($dropout > 20){
			logger("Slave: Dropping back to start :(");
			sleep 5;
			return;
		}
	}

	$ctport->on_hook;
	logger("Slave: On Hook");
	return;
}


sub logger($){
	my $foo = strftime("%Y/%m/%d-%H:%M:%S",localtime(time));
	#print STDERR "$foo [$port] $_[0]\n";
	print LOGFILE "$foo [$port] $_[0]\n";
}

sub procargs(@){
	while($bit = shift @ARGV){
		if ($bit =~ /-d/){
			$daemon=1;
		}
		elsif($bit =~ /-p/){
			$port = 1200 + shift @ARGV;
		}
	}
}

sub daemonize($){
	if ($_[0] == 1){
		# make a daemon
		defined(my $pid = fork) or die "Can't fork: $!";
		exit if $pid;
#		setsid or die "Can't start a new session: $!";
		chdir '/' or die "Can't chdir to /: $!";
		umask 0;
		open STDIN, '/dev/null' or die "Can't read /dev/null: $!";
		open STDOUT, '/dev/null' or die "Can't write to /dev/null: $!";
	}
	return(1);
}

