#!/usr/bin/perl

#use utf8;
use strict;
use CGI;


use Opals::Context;
use Opals::Constant;

use Date::Calc::Object qw(
    :all
);
use POSIX qw(
    floor
);
use Time::localtime;

use Opals::Tb_Fines qw(
    fine_getFineList
    fine_getFineRate
);

use Opals::Template qw(
    tmpl_read
    tmpl_write
    tmpl_preference
);

use Opals::Date qw(
    date_parse
    date_today
    date_text
    date_validateWorkday
    date_deltaWorkDay
    date_addDeltaWorkday
);
use Opals::User qw(
    user_category
    user_list
    user_getInformationById
    user_balance
);

use Opals::Tb_Transactions qw(
    trans_getUnpaidFineList
    trans_getPaymentList
    trans_getODL
    trans_doPayment
    trans_recordFine
    trans_getBalance
);

use Opals::Tb_Circulation qw(
    circ_userListLoanStat
    circ_getUserListLoan
    circ_getUserListReserve
    circ_record_ODL

    circ_userCircStatByRid
);
   # circ_GetLostNumber
   # circ_GetDamagedNumber

use Opals::Locale qw(
    loc_getMsgFile
    loc_write
);

################################################################################

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        => '/txtbk/report/userCircStats.tmpl',
            reqPermission   => 'tb_circ_loan',
        }
);
my $syspref = tmpl_preference($dbh);
my $chargeFine   = $syspref->{'charge_overdue'};
my $chargeDamage = $syspref->{'charge_damage'};
my $chargeLost   = $syspref->{'charge_lost'};
my $loginuid     = $template->param('curUserId');
my $syspref      = tmpl_preference($dbh);
#my $patronItemPrivacy  = $syspref->{'patronItemPrivacy'};
my $patronItemPrivacy  = ($syspref->{'patronItemPrivacy'})? $syspref->{'patronItemPrivacy'} : 1;

my @cookieList = (@$cookie);

my $dateDue;
my @idloanArr;
my $tm = localtime;
my $todayStr = sprintf("%04d-%02d-%02d", $tm->year+1900, ($tm->mon)+1, $tm->mday);
my $dFirst = Opals::Context->preference('dateFirst');
my $dLast  = Opals::Context->preference('dateLast');
#ha

my $circulationSound = $syspref->{'circulationSound'};

if ($permission && $permission->{'tb_circ_loan'}) 
{   
    my ($uid,$status);
        $uid = $input->{'uid'};

    if(!$uid){
         ($uid,$status) = getUID();
    }

    if ($uid >= 0){
       push @cookieList, $cgi->cookie(
            -name   => 'borrower',
            -value  => $uid
        );
       # my $u_block=($status==1?0:1);
        my $u_block=0;
        if($status ==0 || $status ==2){
            $u_block=1;
        }
        $template->param(u_block =>$u_block);

        getUserInfo($dbh,$uid);
     }
}#if ($permission && $permission->{'circ_loan'})

if($circulationSound){
        $template->param(circSound     =>1); 
}
$template->param(
        checkid => 1,
        patronItemPrivacy => $patronItemPrivacy,
);

#Thu, Jan 07, 2010 @ 13:50:35 EST
my $msgValMap ={};
my $stdMsgMap            =loc_getMsgFile('user/userInfo.msg',$msgValMap);
loc_write($template,$stdMsgMap);

tmpl_write($dbh, $cgi, \@cookieList, $template);
#---------------------------------------------------------
sub getUID{
    my ($uid,$status)=(-1,0);
    if ( $input->{'uInput'}) {
        # my @uList = user_list($dbh,  $input->{'uInput'}, USER_ACTIVE);
        my @uList = user_list($dbh,  $input->{'uInput'}, undef);
        if(scalar(@uList)==1){
           $uid = $uList[0]->{'uid'};
           $status= @uList[0]->{'status'};
           if( @uList[0]->{'status'}==1 ){
               $template->param(block =>0);
               @uList[0]->{'block'}=  0;
           }
           else {
               $template->param(block =>1);
           }
            $template->param(uPerson => 1);
        }
        elsif(scalar(@uList)>=1){
            for(my $i=0; $i < scalar(@uList) ; $i++){
                @uList[$i]->{'block'}= @uList[$i]->{'status'}==1 ? 0:1;
            }
           # $template->param(uList => \@uList);
        }
        else{ # Patron not in system
            $template->param(
                userNotMatch =>1);
        }
     $template->param(uList => \@uList);
    }
    elsif ( $input->{'InputFromList'}){
        $uid = $input->{'InputFromList'};
        my ($uInfo,$ttt)=user_getInformationById($dbh,$uid);
        $status=$uInfo->{'status'};
    }
    else{
        if ( $input->{'hiddenid'} ) { 
            $uid = $input->{'hiddenid'}; 
        }
        else { $uid = $cgi->cookie('borrower'); }
        my ($uInfo,$ttt)=user_getInformationById($dbh,$uid);
        $status=$uInfo->{'status'};
    }

    return ($uid,$status);
}
#----------------------------------------------------------

sub getUserInfo{
    my ($dbh,$uid)=@_;
    my ($userInfo, $guardian) = user_getInformationById($dbh, $uid);
    my $balance = trans_getBalance($dbh, $userInfo->{'uid'});
    $balance = floor($balance*100 + 0.50)/100; 
    $balance = sprintf("%.2f",$balance);

    GetLoanItems($dbh, $template, $userInfo->{'uid'});
    GetReservedItems($dbh, $template, $userInfo->{'uid'});
    GetLostDamagedItems($dbh, $userInfo->{'uid'});
    getPayRefFgv($dbh, $userInfo->{'uid'});
    $template->param(
        user_uid            => $userInfo->{'uid'},
        user_barcode        => $userInfo->{'userbarcode'},
        user_username       => $userInfo->{'username'},
        user_firstname      => $userInfo->{'firstname'},
        user_lastname       => $userInfo->{'lastname'},
        homeroom            => $userInfo->{'homeroom'},
        teacher             => $userInfo->{'teacher'},
        grade               => $userInfo->{'grade'},
        notes               => $userInfo->{'notes'},
        address             => $userInfo->{'addrLine1'},
        city                => $userInfo->{'city'},
        state               => $userInfo->{'state'},
        zip                 => $userInfo->{'zip'},
        hasBalance          => ($balance>0)? 1:0,
        balance             => $balance,
    );

    $template->param(hiddenid => $userInfo->{'uid'});
   
    $template->param( guardian => \@$guardian);

    my $showFine = ($syspref->{'charge_overdue'} == 1 && $balance == 0) ? 0:1;
    $template->param(showfine => $showFine);
}
#----------------------------------------------------------
sub GetLoanItems
{
    my ($dbh, $template, $uid) = @_;
    
    # List items loaned by this borrower
    my ($loanListStat,$loanList, $reserveList);
    $loanListStat = circ_userListLoanStat($dbh, $uid);
    $loanList     = circ_getUserListLoan($dbh, $uid);
    my $count = 0;
    my $odCount = 0;
    my $total =0;
    my $lastloanDate = '';
    foreach my $l (@$loanListStat) 
    {
       $total += $l->{'totalCirc'};
       $l->{'dateLoan'}     = date_text($l->{'dateLoan'}, 0);
       $l->{'dateDue'}      = date_text($l->{'dateDue'}, 0);
       if($l->{'dateReturn'} && $l->{'dateReturn'} ne ''){
            $l->{'dateReturn'}   = date_text($l->{'dateReturn'}, 0);
       }
     }

    foreach my $loan (@$loanList) 
    {
        
        if ( $lastloanDate lt $loan->{'dateLoan'} ) { $lastloanDate = $loan->{'dateLoan'}; }
        if ( $loan->{'overdue'} ) { $odCount++; }
        $loan->{'dateLoan'} = date_text($loan->{'dateLoan'}, 0);
        $loan->{'dateDue'}  = date_text($loan->{'dateDue'}, 0);
        $loan->{'number'} = $count++;
        if($loan->{'barcode'} =~m/^\_\_\_(.*)/){
            $loan->{'org_barcode'} =$1;
        }
        else{
            $loan->{'org_barcode'} =$loan->{'barcode'};
        }
        
    }
    $template->param(loanListStat => \@$loanListStat);
    $template->param(total => ($total + scalar(@$loanList)));
    $template->param(loanList     => \@$loanList);
    $template->param(LoanCount    => scalar(@$loanList));
    $template->param(NumOfOverdue => $odCount);

    
    if ( $lastloanDate eq '' )
        { $template->param(LastLoanDate => "none" ); }
    else
        { $template->param(LastLoanDate => date_text($lastloanDate, 0) ); }

}
#----------------------------------------------------------
sub GetLostDamagedItems
{
    my ($dbh, $uid) = @_;
    my $dir ='desc';
    my $balance = trans_getBalance($dbh,$uid);
        $template->param(
           balance => $balance,
        );
#   *NOTE* refer transaction codes from opl_transcode
#   1:overdue; 2:lost ; 3: damaged

    my @transTbl_lost = trans_getODL($dbh,$uid,$dir,2);
      $template->param(
            transList_lost  =>\@transTbl_lost,
            numTrans_lost   =>scalar(@transTbl_lost),
        );

    my @transTbl_damage = trans_getODL($dbh,$uid,$dir,3);
      $template->param(
            transList_damage  =>\@transTbl_damage,
            numTrans_damage   =>scalar(@transTbl_damage),
        );
    my @transTbl_od = trans_getODL($dbh,$uid,$dir,1);
      $template->param(
            transList_od  =>\@transTbl_od,
            numTrans_od   =>scalar(@transTbl_od),
        );
    my $numTrans =   scalar(@transTbl_lost) + scalar(@transTbl_damage) + scalar(@transTbl_od);
    if($numTrans>0){
        $template->param( showLostDamagedOd  =>1,
        );
    }
      $template->param(
          numTrans       => $numTrans,
        );
 
  }

#----------------------------------------------------------
sub getPayRefFgv{
#payment, refund, refund lost credit, forgive :prcf

    my ($dbh, $uid) = @_;
    my $dir ='desc';
    my @transTbl_payment = trans_getPaymentList($dbh,$uid,$dir);    
    $template->param(
            prcfList_pmt  =>\@transTbl_payment,
            numTrans_pmt   =>scalar(@transTbl_payment),
        );
    
    my $numPay = scalar(@transTbl_payment) ;
       $template->param(numPay => $numPay);


}

#----------------------------------------------------------
sub GetReservedItems
{
    my ($dbh, $template, $uid) = @_;
    
    my $reserveList = circ_getUserListReserve($dbh, $uid);
    my $order = 0;
    foreach my $reserve (@$reserveList) 
    {
        $reserve->{'order'} = $order++;
        $reserve->{'dateReserve'} = date_text($reserve->{'dateReserve'}, 0);
        $reserve->{'dateExpiry'}  = date_text($reserve->{'dateExpiry'}, 0);
     }

    $template->param(NumOfReserves => scalar(@$reserveList));
    #$template->param(hasReserves => scalar(@$reserveList));;
    $template->param(reserveList => \@$reserveList);
}



