#!/usr/bin/perl -w
use DBI;
use strict;

my (%agienv, $dbh, $name, $number, $q);
my (@npainfo, $npa, $nxx, $ext);

$| = 1;

if (!($dbh = sql_connect())) {
	ast_verbose("Couldn't connect to SQL server!");
	exit;
}

%agienv = ast_get_agienv();

if (!defined($agienv{'agi_callerid'})) {
	ast_verbose("No caller ID to parse!");
	exit;
}

if (!(($name, $number) = parse_cid(%agienv))) {
	ast_verbose("Unable to parse CID: " . $agienv{'agi_callerid'});
	exit;
}

if ($number =~ /^1(\d\d\d)(\d\d\d)(\d+)$/) {
	$npa = $1;
	$nxx = $2;
	$ext = $3;
} else {
	ast_verbose("Unable to parse number: '$number'");
	exit;
}

ast_verbose("Parsed number: npa=$npa nxx=$nxx ext=$ext");

$q = "SELECT t.abbr,n.ratecenter,n.switch,n.ocn,n.npa,n.nxx " .
	"FROM npanxx AS n,territory AS t WHERE " .
	"npa=" . $dbh->quote($npa) . " AND " .
	"nxx=" . $dbh->quote($nxx) . " AND t.id=n.territory;";

ast_verbose("Query: $q");

if (!(@npainfo = $dbh->selectrow_array($q))) {
	ast_verbose("Unable to fetch information for $npa-$nxx");
	exit;
}

$npainfo[2] = 'UNKNOWN' if (!defined($npainfo[2]));

ast_verbose("Call info: $npainfo[4]-$npainfo[5]: $npainfo[0]/$npainfo[1] ($npainfo[2] on $npainfo[3])");
print "SET VARIABLE LOOKUP_NPA \"$npainfo[4]\"\n";
print "SET VARIABLE LOOKUP_NPX \"$npainfo[5]\"\n";
print "SET VARIABLE LOOKUP_TERRITORY \"$npainfo[0]\"\n";
print "SET VARIABLE LOOKUP_RATECENTER \"$npainfo[1]\"\n";
print "SET VARIABLE LOOKUP_SWITCH \"$npainfo[2]\"\n";
print "SET VARIABLE LOOKUP_OCN \"$npainfo[3]\"\n";

exit;


sub sql_connect
{
	DBI->connect("DBI:mysql:npanxx;host=frink.tricountyi.net", "npanxxro", "", { PrintError => 0, PrintWarn => 1 });
}

sub ast_verbose
{
	my ($text) = @_;
	
	$text =~ s/\"/\\\"/g;
	
	print "VERBOSE \"$text\"\n";
}

sub ast_get_agienv
{
	my (@parts, $buf, %env);
	while (defined($buf = <STDIN>)) {
		chomp($buf);

		last if ($buf eq '');

		@parts = split(':(?: |$)', $buf);
		$env{$parts[0]} = $parts[1];
	}
	return %env;
}

sub parse_cid
{
	my (%agienv) = @_;
	my ($name, $number);

	if ($agienv{'agi_callerid'} =~ /^"(.*)" <([^>]+)>$/) {
		ast_verbose("Parsed CID in '\"name\" <number>' format");
		$name = $1;
		$number = $2;
		return ($name, $number);
	} elsif ($agienv{'agi_callerid'} =~ /^([^<]+)$/) {
		ast_verbose("Parsed CID in 'number' format");
		$name = '';
		$number = $1;
		return ($name, $number);
	} else {
		return;
	}
}
