#!/usr/bin/perl

#use utf8;
use strict;
use CGI;

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

use Date::Calc::Object qw(
    :all
);
use POSIX qw(
    floor
);
use Time::localtime;
use Opals::Template qw(
    tmpl_read
    tmpl_write
    tmpl_preference
);
use Opals::User qw(
    user_getInformationById
);
use Opals::Transaction qw(
    trans_getBalance
    trans_getChargeList
    trans_getReceiptList
);



use Opals::Locale qw(
    loc_getMsgFile
    loc_write
);
use Opals::Circulation qw(
    circ_userListLoanStat
    circ_userListLoan
    circ_userListReserve
    circ_userClaimList
);
use Date::Calc qw(
    Today 
    Add_Delta_Days 
);
use Opals::Date qw(
    date_text
);
################################################################################

my $dbh = Opals::Context->dbh();
END { $dbh->disconnect(); }

my $tm = localtime;
my $cgi = CGI->new;
my $input = $cgi->Vars();
my ($permission, $cookieList, $template) = tmpl_read(
        {
            dbh             => $dbh,
            cgi             => $cgi,
            tmplFile        => 'user/userInfo.tmpl'
        }
);

my $anonymizeLoan=Opals::Context->preference("anonymizeLoan");
my $loanStatsFrom=undef;
if(defined $anonymizeLoan && $anonymizeLoan>0){
    my ($year,$month,$day)=Today();
    ($year,$month,$day)=Add_Delta_Days($year,$month,$day,-1*$anonymizeLoan);
    $loanStatsFrom=sprintf "%4d-%02d-%02d",$year,$month,$day;
}

my $formType="k_12";
my $libType = Opals::Context->preference('libraryType')|| 'k-12';
if($libType eq 'public'){
    $formType="public";
}
elsif($libType eq 'academy'){
    $formType="academy";
}
my $uid = $input->{'uid'};
if(!$uid || $uid<=0){
    $uid = $cgi->cookie('borrower');
}
my ($sortTbl,$sortField) = ('','');
my $count = 0;
my $odCount = 0;
my $lastloanDate = '';
my $patronPrivacyOn  =Opals::Context->preference('patronItemPrivacy')|| 0;

if($uid>0){
     push @$cookieList, $cgi->cookie(
            -name       => 'borrower',
            -value      =>  $uid,
        );

    my ($userInfo, $guardian) = user_getInformationById($dbh, $uid);
    my $balance= trans_getBalance($dbh, $uid);
    $userInfo->{"accountBalance"}=$balance;
    $userInfo->{"guardianList"}=$guardian;
    my $userJSON   = to_json($userInfo, {pretty => 1})  ;
    
    my $loanStats=getLoanStats($dbh, $uid,$loanStatsFrom);
    my $claimList       = circ_userClaimList($dbh, $uid);
    my $claimListJSON   = to_json($claimList, {pretty => 1});

    #reserve list
    my $reserveListJSON =to_json(circ_userListReserve($dbh, $uid),{pretty => 1});
    #odl List
    my $odlListJSON=to_json(trans_getChargeList($dbh,$uid),{pretty => 1});
    #receipt list
     my $receiptListJSON=to_json(trans_getReceiptList($dbh,$uid),{pretty => 1});

    $template->param(userInfo    =>$userJSON,
                     loanStats    =>to_json($loanStats,{pretty=>1}),
                     reserveList =>$reserveListJSON ,
                     odlList     =>$odlListJSON,
                     claimList   =>$claimListJSON,
                     receiptList =>$receiptListJSON,
                     patronPrivacyOn     =>$patronPrivacyOn,
                     uid=>$uid
                     );
}
 
my $msgValMap ={};
my $stdMsgMap            =loc_getMsgFile('user/userInfo.msg',$msgValMap);
loc_write($template,$stdMsgMap);
my $msgMap            =loc_getMsgFile('report/reports.msg',$msgValMap);
loc_write($template,$msgMap);

$template->param(libType=>$libType,
                hlpUrl   => Opals::Constant->getHlpUrl('userCircStats') );

tmpl_write($dbh, $cgi, $cookieList, $template);

#---------------------------------------------------------
sub getOnLoanList{
    my($dbh, $uid,$loanStatsFrom)=@_;
    my $loanList     = circ_userListLoan($dbh, $uid) ;
    my $retList=[];
    my ($circStats)=$dbh->selectrow_array("select circStats from opl_user where uid=?",undef,$uid);
    my $loanStats={};
    if($circStats ne''){
        $loanStats=decode_json($circStats);
    }
    foreach my $loan (@$loanList){
        if($loan->{'barcode'} =~m/^\_\_\_(.*)/){
            $loan->{'org_barcode'} =$1;
        }
        else{
            $loan->{'org_barcode'} =$loan->{'barcode'};
        }
        if(!defined $loanStatsFrom || $loan->{'dateLoan'} gt $loanStatsFrom ){
            push @$retList,$loan;
        }
        if(defined $loanStatsFrom){
            my $year=substr($loan->{'dateLoan'},0,4);
            my $hasStats=0;
            while(my ($y,$c)= each %$loanStats){
                 if($year eq $y || $y =~ m/$y/){
                     $loanStats->{$y} = $c+1;
                     $hasStats=1;
                     last;
                 }
            }
            $loanStats->{$year} =1 if(!$hasStats);
        }

    }
    my $loanStatsArr=[];
    my $totalLoan=0;
    foreach my $y(sort keys %$loanStats){
        push @$loanStatsArr,{year=>$y,loans=>$loanStats->{$y}};
        $totalLoan += $loanStats->{$y};
    }

    return ($retList,$loanStatsArr,$totalLoan);
}

#---------------------------------------------------------
sub getLoanStats{
    my($dbh, $uid,$loanStatsFrom)=@_;
    my $stats={loanHistory=>[]};
    my ($circStats)=$dbh->selectrow_array("select circStats from opl_user where uid=?",undef,$uid);
    my $loanCount={};
    if($circStats ne''){
        $loanCount=decode_json($circStats);
    }

    #get loan hostory
    my $loanHistory =circ_userListLoanStat($dbh, $uid);
    if(!defined $loanStatsFrom){
        $stats->{'loanHistory'}=$loanHistory;
    }
    else{
        foreach my $l(@$loanHistory){
            if($l->{'dateLoan'} gt $loanStatsFrom){
                push @{$stats->{'loanHistory'}},$l;
            }
       }
    }
    #get current loan list
    $stats->{'curLoanList'} = circ_userListLoan($dbh, $uid) ;
    foreach my $loan (@{$stats->{'curLoanList'}}){
        if($loan->{'barcode'} =~m/^\_\_\_(.*)/){
            $loan->{'org_barcode'} =$1;
        }
        else{
            $loan->{'org_barcode'} =$loan->{'barcode'};
        }
        push @$loanHistory,$loan;
    }
=item    
    foreach my $loan (@$loanHistory){
        my $year=substr($loan->{'dateLoan'},0,4);
        my $hasStats=0;
        while(my ($y,$c)= each %$loanCount){
             if($year eq $y || $y =~ m/$y/){
                 $loanCount->{$y} = $c+1;
                 $hasStats=1;
                 last;
             }
        }
        $loanCount->{$year} =1 if(!$hasStats);
    }
=cut
    
    my $totalLoan=0;
    $stats->{'loanCount'}=[];
    foreach my $y(sort keys %$loanCount){
        next if($y eq "L");
        push @{$stats->{'loanCount'}},{year=>$y,loan=>$loanCount->{$y}};
        $totalLoan += $loanCount->{$y};
    }
    $stats->{'totalLoan'}=$totalLoan;
    return $stats;
}
