#!/usr/bin/perl -w
use strict;
use warnings;
my $tty = '/dev/ttyS1';
my $csv_log_file='/var/log/alcatel.csv';
my $log_raw="yes";
my $raw_log_file='/var/log/alcatel.raw';
my $log_errors="yes";
my $error_log_file='/var/log/alcatel.err';
my $headers="Subscriber,Name,CCN,EndCallDate,EndCallTime,Duration,Cost,VSACMF,O,Transfer Subscriber,Called Number,P,Code,PNI,SBNode,TKNode,TGN,Trunk,C,A\n";
setup_log_files($csv_log_file);
if ($log_raw eq "yes"){
	setup_log_files($raw_log_file);
}
if ($log_errors eq "yes"){
	setup_log_files($error_log_file);
}
setup_log_files($csv_log_file);
if ( -z $csv_log_file){
	open (LOG, ">>$csv_log_file") or die "Can't open $csv_log_file for writing!";
	print LOG $headers;
	close ( LOG );
}
open (FILE, "<:crlf", "$tty") or die "Can't open $tty, please make sure the correct serial port is selected.";

while(<FILE>) {
	my $CD_record = $_;

	if (($log_raw eq "yes") && ($CD_record ne "\n")) {
		open ( RAW_LOG, ">>$raw_log_file") or die qq(Can't open "$raw_log_file": $!);
		print RAW_LOG $CD_record;
		close ( RAW_LOG );
	}

	my $CDR_line_number = which_line($CD_record);
	if (($CDR_line_number == 1) || ($CDR_line_number == 2)) {
		open ( LOG, ">>$csv_log_file" ) or die qq(Can't open "$csv_log_file": $!);
		print LOG format_call_record($CD_record,$CDR_line_number);
		close ( LOG );
	}
	else {
		if (($log_errors eq "yes") && ($CD_record ne "\n")){
			open ( ERROR_LOG, ">>$error_log_file" ) or die qq(Can't open "$error_log_file": $!);
			print ERROR_LOG $CD_record;
			close ( ERROR_LOG );
		}
	}
}

sub which_line {
	my $record = shift;
	return 1 if $record =~ /^\|.{25}\|.{10}\|.*\|[0A-Z]\|$/;
	return 2 if $record =~ /^\|.{29}\|[BNPG]\|.{12}\|.{4}\|.*\|$/;
	return 3;
}

sub setup_log_files {
	my $log_file = shift;
	if (! -e $log_file) {
		open (CREATE_FILE, ">$log_file") or die qq(Can't create "$log_file": $!);
		print CREATE_FILE "";
		close ( CREATE_FILE );
	}
}

sub format_date {
	my $date = shift;

	my( $year, $month, $day, $hour, $minute ) = $date =~ /../g;

	return sprintf '%s/%s/20%s,%s:%s', $month, $day, $year, $hour, $minute;
}

sub format_call_record {
	my ($record, $line_number) = @_;
	my $line_one_start=1;
	my $line_one_end=8;
	my $line_two_start=0;
	my $line_two_end=11;
	my $date_field=3;

	if ( $line_number == 1 ) {
		my @fields =  (split /\|/, $record) [ $line_one_start .. $line_one_end ];
		$fields[$date_field] = format_date($fields[$date_field]);
		return join ',', @fields;
	} elsif ( $line_number == 2 ) {
		my @fields = ( split /\|/, $record ) [ $line_two_start .. $line_two_end ];
		$fields[$line_two_end] = $fields[$line_two_end] . "\n";
		return join ',', @fields;
	} else  {
	
		return
			"\nWARNING: Invalid line number ($line_number)".
			" detected in format_call_record().\n";
	}
}
