#!/usr/bin/perl

#use utf8;
use strict;
use CGI;

use Opals::Context;
use Opals::Template qw(
    tmpl_read
    tmpl_write
    tmpl_preference
);
use POSIX qw(
    ceil
    floor
);

use Time::localtime;
use Opals::User qw(
    user_getInformationById
);
use Opals::Circulation qw(
    circ_userListLoan
    circ_isOnReserve
);
use Opals::Date qw(
    date_text
    date_DHM_text
);
use Opals::Locale qw(
    loc_getMsgFile
    loc_write
);
use Opals::Transaction qw(
    trans_getReceiptDetail
);
use Opals::POS;
use JSON;
my $dbh = Opals::Context->dbh();
END { $dbh->disconnect(); }

my $cgi      = CGI->new;
my $input    = $cgi->Vars();

my ($permission, $cookie, $template) = tmpl_read(
    {
        dbh             => $dbh,
        cgi             => $cgi,
        tmplFile        => 'billing/paymentReceiptPrinter.tmpl',
        reqPermission   => 'fine|payment',
    }
);

my $tm      = localtime;
my $pos     =Opals::POS->new();
my $syspref = tmpl_preference($dbh);
my $dateToday = sprintf("%04d-%02d-%02d", 
                            $tm->year+1900, 
                            ($tm->mon)+1, 
                            $tm->mday);

  # Get COMMAND PRINTER
    my $f_typeA_bold  = {'type'  => 'A','weight'  => 'bold'};
    my $f_typeB_bold  = {'type'  => 'B','weight'  => 'bold'};
    my $f_typeA_normal= {'type'  => 'A'};
    my $f_typeB_normal= {'type'  => 'B'};
    my ($marginL_def,$marginR_def)=(0,0);
    my ($marginL,$marginR)=(7,7);

    my $cmdFont_typeB_normal  = $pos->getCmd_font($f_typeB_normal);
    my $cmdFont_typeA_normal  = $pos->getCmd_font($f_typeA_normal);
    my $cmdFont_typeA_bold    = $pos->getCmd_font($f_typeA_bold);
    my $cmdFont_typeB_bold    = $pos->getCmd_font($f_typeB_bold);
    my $cmd_alignCenter       = $pos->getCmd_align("center");
    my $cmd_alignLeft         = $pos->getCmd_align("left");
    my $cmd_alignRight        = $pos->getCmd_align("right");


if ($permission && $permission->{'fine'}) {
    # School/Library Info *************************************** *
    my $libname     = $syspref->{'libname'}."\r\n";
    my $headerTxt   = "Payment Receipt";
    
    # Item Info  ************************************************
    my $pid = $input->{'pid'};
    my $msgValMap ={};
    my $msgMap  =loc_getMsgFile('circ/payment.msg',$msgValMap);
    my $receipt = trans_getReceiptDetail($dbh,$pid);
       translateChageType($receipt->{'itemList'},$msgMap);
    my $paidCash = ($receipt->{'payMethod'} eq 'cash')?1:0;
    my $change   = $receipt->{'changeAmnt'};
    my $balance  = $receipt->{'accountBalance'};

  
    # Patron Info ************************************************
    my ($patron, $guardian) = user_getInformationById($dbh, $receipt->{'uid'});
    my $uBc= $patron->{'userbarcode'}||""; 
       $uBc ="XXXXXXXXXX" . substr($uBc,length($uBc) -4);
       $uBc =substr($uBc,length($uBc) -10);
    my $printDate   =formatTxtRow(getDateStr($tm),getTimeStr($tm));
    my $t= $msgMap->{'clerkTxt'}.": ".$receipt->{'responsible'};
    my $resp        = formatTxtRow($msgMap->{'wrkstmTxt'}.": Circ-out", $t);
    my $borrower    = formatTxtRow($msgMap->{'borrowerNumberTxt'}, $uBc);
    my $headerTbl   = formatHeaderTbl( $msgMap->{'dateTxt'},$msgMap->{'descLbl'}, $msgMap->{'amountTxt'});
    my $itemListStr = createPaymentInfo($receipt->{'itemList'},$msgMap);
    $template->param(
            cmdBold         =>$cmdFont_typeA_bold,
            cmdNormal       =>$cmdFont_typeA_normal,
            cmdBold_A       =>$cmdFont_typeA_bold,
            cmdNormal_A     =>$cmdFont_typeA_normal,
            cmdBold_B       =>$cmdFont_typeB_bold,
            cmdNormal_B     =>$cmdFont_typeB_normal,
            cmd_alignCenter =>$cmd_alignCenter,
            cmd_alignLeft   =>$cmd_alignLeft,
            cmd_alignRight  =>$cmd_alignRight,
            printDate       =>$printDate,
            resp            =>$resp,
            libraryName     =>$libname,
            headerTxt       =>$headerTxt,
            wrkstnTxt       =>"Wrkstm",
            wrkstn          =>"Circ-out",
            clerkTxt        =>"Clerk",
            borrower        =>$borrower,
            itemList        =>$receipt->{'itemList'},
            headerTbl       =>$headerTbl,
            itemListStr     =>$itemListStr,
            total           =>sprintf("%.2f",$receipt->{'withdrawn'} + $receipt->{'recieved'}),
            tender          =>sprintf("%.2f",$receipt->{'tender'}),
            payMethod       =>sprintf("%6s",$receipt->{'payMethod'}),
            change          =>sprintf("%.2f",$receipt->{'changeAmnt'}),
            balance         =>sprintf("%.2f",$receipt->{'accountBalance'}),
            footer          =>""
    );
    loc_write($template,$msgMap);
    tmpl_write($dbh, $cgi,$cookie , $template);
}

#-------------------------------------------------------------------------------
sub translateChageType{
    my($transList,$msgMap)=@_;
    my $tMap={
                OVERDUE_CHARGED=>'overdueTxt' ,
                LOST_CHARGED=>'lostTxt'    ,
                DAMAGE_CHARGED=>'damageTxt' , 
                PAYMENT=>'paymentTxt',         
                FORGIVE=>'waiveTxt',         
                CREDIT_REFUND=>'creditRefundTxt',   
                RATE_ADJUSTMENT=>'rateAdjTxt', 
                REFUND=>'refundTxt',          
                SERVICE_FEE=>'feeTxt'  
             };
    foreach my $t(@$transList){
        my $msgKey=$tMap->{$t->{'chargeCode'}};
        $t->{'onDate'} = substr($t->{'onDate'},0,10);
        $t->{'onDate'} =~ s/-/\//g;
        $t->{'chargeName'}=(defined$msgMap->{$msgKey})?$msgMap->{$msgKey}:$t->{'chargeCode'};
    }
}


#-------------------------------------------------------------------------------------------------
sub createPaymentInfo{
    my($items,$msgMap)=@_;

  my($items,$msgMap)=@_;
    my $retStr= "";
    my ($desc ,$amt) =('',0.00); my $descLen =0; my $p=0;
    foreach my $item (@$items){
        my $tmpStr ="";
        $amt = ($item->{'paid'} )? $item->{'paid'}: $item->{'refund'};
        $desc= $item->{'onDate'} . ' ' . $item->{'title'} . " " . $item->{'barcode'} . " " . $item->{'callNumber'};
        my $l=32;
        my $c=substr($desc,$l,1);
        while($c ne ' '){
            $l--;
            $c=substr($desc,$l,1);
        }
        my $line1= sprintf("%-32s%8s\n",substr($desc,0,$l), $amt) ;
        $tmpStr=substr($desc, $l+1,length($desc) - $l);
        $tmpStr =~ s/^\s+//g;
        $tmpStr= $line1 .  $pos->formatTxt($tmpStr,$f_typeA_normal,2,8);   
        $retStr .= $tmpStr ."\n\n";
     }
    return $retStr ;
}
#-------------------------------------------------------------------------------------------------
sub formatHeaderTbl{
    my($dateTxt,$descTxt,$amtTxt)=@_;
    my $retStr= sprintf ("%s %22s %14s", $dateTxt, $descTxt, $amtTxt);
    return $retStr ;
}
#-------------------------------------------------------------------------------------------------
sub formatTxtRow{
    my($strLeft,$strRight,$fs)=@_;
    my $posR =length($strRight);
    my $posL =40- $posR+1;
    my $pos= ($posR > $posL)? $posL: $posR;
   my $str =  sprintf "%-".$posL."s %".$posR."s", $strLeft,$strRight;
   return $str;

}
#-------------------------------------------------------------------------------------------------
sub getDateStr{
    my($tm)=@_;
    my $dateStr=   sprintf("%04d/%02d/%02d",,$tm->year +1900,$tm->mon+1,$tm->mday);
    return $dateStr;
}

#-------------------------------------------------------------------------------------------------
sub getTimeStr{
    my($tm)=@_;
    my $h =$tm->hour;
    my $m =$tm->min;
    my $am_pm="AM";
    if($h>12){
        $am_pm ="PM";
        $h -=12;
    }
    my $timeStr=   sprintf("%02d:%02d %s",$h,$m,$am_pm);
    return $timeStr;
}


