#!/usr/bin/perl
use Time::Local;
use Getopt::Long;
use Pg;



GetOptions(
                "help|h", \&usage,
                "daemon|d",\$daemon,
		"conf|c=s",\$rc
        ) || usage();

$rc	= ( $rc ? $rc : "/etc/pblogan.conf" );
do $rc || die "No existe configuracion base [$rc] ...\n" ;

open( LOG, $log ) || die "No se pudo abrir el archivo $log" ;
$conn = Pg::setdbLogin($pghost, $pgport, $pgoptions, $pgtty, $dbname, $user, $password);
die $conn->errorMessage unless PGRES_CONNECTION_OK eq $conn->status;

$numrec = 0;
if( $daemon ){
	for(;;){
		for( $curpos = tell(LOG); <LOG>; $curpos=tell(LOG) ){
			insertdb($_);
	        }
		seek( LOG, $curpos, 0 );
		sleep( $pause );
	}
}else{
	while( <LOG> ){
		insertdb($_);
	}
}


sub insertdb{
my ($rec, $fecha, $hora, $interno, $linea, $numero, $duracion, $duraseg, $costo, $codigo );

	$numrec++;
       	if( /[0-9]/ ){
               	tr/\r//d;
                chop;
		($fecha, $hora, $interno, $linea, $numero, $duracion, $duraseg, $codigo ) = desarma( $_ );
		$numero =~ tr/ //d;
		if( $numero =~ /[0-9]/ ){
			if( $numero !~ "incoming" && $numero =~ /[0-9]/ && $duraseg > 10 ){
				$min=minutos($duraseg);
				$tar=quetarifa( $numero, $fecha, $hora );
				$costo="'\$" . sprintf( "%.2f", $tar*$min ) . "'";
			}else{
				$costo="'\$0.00'";
			}
			# print( "$fecha\n" );
			$result=$conn->exec( "INSERT INTO log VALUES( '$fecha','$interno','$linea','$numero','$duracion',$duraseg, $numrec, $costo )");
			#die $conn->errorMessage unless PGRES_COMMAND_OK eq $result->resultStatus;
		}
	}
}


sub segundos{
my ($hora, $min, $seg );

	($hora,$min,$seg)=split(/:/,$_[0]);
	return ($hora*3600)+($min*60)+$seg;
}

sub minutos{
my ($s);

        $s=$_[0];
        if( $s < 60 ){
                return 1;
        }else{
                return( int($s/60)+(($s%60)>0 ? 1 : 0) );
        }
}

sub dow{
my ($fecha, $time, @atime );

        $fecha=$_[0];
        $time=timelocal(0,0,0,substr($fecha,3,2),substr($fecha,0,2)-1,substr($fecha,6,2) );
        @atime=localtime($time);
        return $atime[6];
}



sub desarma{
my ($str, $fec, $hor, $int, $lin, $num, $dur, $seg, $who, $cod, @row);

	$str=$_[0];
	if( $brand =~ /panasonic/ ){
		$fec=substr($str,0,8);
		$fec =~ tr/ /0/;
		$fec=$fec . " " . substr($str,10,7);
		$hor=substr($str,10,2);
		$hor+=(substr($str,15,2) =~ /P/ and $hor < 12 ? 12 : 0 );
		$hor.=":".substr($str,13,2);
		$int=substr($str,19,2);
		$lin=substr($str,23,2);
		$num=substr($str,26,38);
		$dur=substr($str,64,5) . ":" . substr($str,70,2);
	        $who=substr($str,74,4);
	}elsif( $brand=~/goldstar/ ){
		$int=substr($str,0,3);
		$lin=substr($str,4,1);
		$dur=substr($str,6,8);
		$hor=substr($str,15,5);
		$fec=substr($str,21,8) . " " . $hor;
		$num=substr($str,32);
		$who="";
	}
	$seg = segundos($dur);
	$num =~ tr/A-Z//d;

        if( $who =~ /[0-9]/ ){
                $result=$conn->exec( "SELECT codigo FROM personas WHERE passwd = '$who';" );
                if( PGRES_EMPTY_QUERY != $result->resultStatus ){
                        @row=$result->fetchrow;
                        $cod=$row[0];
                }else{
                        $cod=" ";
                }
        }else{
                $cod=" ";
        }

	return ($fec,$hor,$int,$lin,$num,$dur,$seg,$cod);
}


sub quetarifa{
my ($number, $fecha, $costo,$codigo,$xhora, $hora, $dow,$pulsos);

        $number=$_[0];
        $fecha =$_[1];
        $hora  =$_[2];

        $number =~ tr/ //d;
        if( length( $number ) <= 1 ){
                return 0;
        }else{
                # $number=$_[0];
                $result=$conn->exec( "SELECT costo,codigo,xhora FROM costos WHERE '$number' ~ pref ;" );
                die $conn->errorMessage unless PGRES_TUPLES_OK eq $result->resultStatus;


                ($costo,$codigo,$xhora)=$result->fetchrow;
                if( $xhora=~/t/ ){
                        $dow  = dow( $fecha );
                        $result=$conn->exec( "SELECT pulsos FROM tarifas WHERE codigo = '$codigo' AND '$dow' ~
dow AND '$hora' BETWEEN desde AND hasta ;" );
                        die $conn->errorMessage unless PGRES_TUPLES_OK eq $result->resultStatus;
                        ( $pulsos )=$result->fetchrow;
                        $costo*=$pulsos;
                }
                return $costo;
        }
}


sub usage{
	print STDERR <<EOF;
Usage: phonedb [options]
  -c  --conf                Config File (default /etc/pblogan.conf)
  -d, --daemon              Daemonize
  -h, --help                Display this help message.
EOF
	exit 1;
}
