package Opals::HTMLComponents;
require Exporter;
@ISA       = qw(Exporter);

@EXPORT_OK = qw(
    hc_getQuickUserEntryFormHTML
    hc_getUserAccountInfoHTML
);
# Version number
$VERSION   = 0.01;
use strict;

use POSIX qw(
    ceil
    floor
);
use JSON;
use HTML::Template;
use Opals::Locale qw(
    loc_getMsgFile
    loc_write
);
use Opals::User qw(
    user_currentUser
    user_LoadCategory_1
    user_getInformationById
);
use Opals::Constant;
use Opals::Permission qw(
    permission_getList
    permission_getDefaultPermission

);
use Opals::Circulation qw(
    circ_userListLoanStat
    circ_userListLoan
    circ_userListReserve
    circ_GetLostNumber
    circ_GetDamagedNumber
);
use Opals::Date qw(
    date_text
);
use Opals::Transactions qw(
    trans_getPaymentList
    trans_getODL
);
use Opals::Transaction qw(
    trans_getBalance
);

use Opals::Eq_Circulation;
use Opals::Tb_Circulation;
#====================================================================================
sub hc_getQuickUserEntryFormHTML{
    my($dbh)=@_;
    my $rootDir   = Opals::Context->config('rootDir');
    my $template = HTML::Template->new(    
                filename            => "quickUserAjaxFrm.inc",
                path                => "$rootDir/htdocs/theme/opals/ajax/circ/",
                global_vars         => 1,
                die_on_bad_params   => 0,
                cache               => 1,
                shared_cache        => 0,
                loop_context_vars   => 1,);
    my $defaultPList = permission_getDefaultPermission($dbh);
    $template->param(
        defaultpList => $defaultPList,
        );


    my @brwrtype;
    @brwrtype = user_LoadCategory_1($dbh);
    foreach my $c (@brwrtype){
        if($c->{'def'}){
            foreach my $dp(@$defaultPList){
                if($dp->{'catid'} eq $c->{'catid'}){
                    $template->param( defaultPermissions => $dp->{'defaultPerm'});
                    last;
                }
            }
            last;
        }
    }
    $template->param( category => \@brwrtype );

    my $msgMap            =loc_getMsgFile('user/userInfo.msg');
    loc_write($template,$msgMap);
    return $template->output;
}
#====================================================================================
sub hc_getUserAccountInfoHTML{
    my($dbh,$uid,$options)=@_;
    my $rootDir   = Opals::Context->config('rootDir');
    my $template = HTML::Template->new(    
                filename            => "userAccountInfo.inc",
                path                => "$rootDir/htdocs/theme/opals/ajax/user/",
                global_vars         => 1,
                die_on_bad_params   => 0,
                cache               => 1,
                shared_cache        => 0,
                loop_context_vars   => 1,);

   my $userAcntInfo =  getUserInfo($dbh,$uid,$options);
   $userAcntInfo->{'textbook'} = getTextbookInfo($dbh,$uid,$options);
   $userAcntInfo->{'equipment'} = getEquipmentInfo($dbh,$uid,$options);
   my $userInfo = $userAcntInfo->{'userInfo'};
   my $balance = trans_getBalance($dbh, $uid);
      $balance = floor($balance*100 + 0.50)/100; 
      $balance = sprintf("%.2f",$balance);
   
   my $isShowBalance = ($balance==0)?0:1;
   $template->param(
        userInfo            => to_json($userAcntInfo->{'userInfo'}, {pretty=>1}),
        balance             => $balance,
        lib_loanList        => to_json($userAcntInfo->{'u_loanList'}->{'loanList'}) ,
        lib_reserveList     => to_json($userAcntInfo->{'u_reserveList'}->{'reserveList'}) ,
        lib_loanListStat    => to_json($userAcntInfo->{'u_loanList'}->{'loanListStat'}),
        lib_showLostDamagedOd=> ($userAcntInfo->{'u_odlList'}->{'numTrans'}>0)?1:0,
        lib_transList_lost  => to_json($userAcntInfo->{'u_odlList'}->{'transList_lost'}),
        lib_transList_damage=> to_json($userAcntInfo->{'u_odlList'}->{'transList_damage'}),
        lib_transList_od    => to_json($userAcntInfo->{'u_odlList'}->{'transList_od'}),
        libraryInfo_show    => ($userAcntInfo->{'u_loanList'}->{'LoanCount'}>0 ||
                                $userAcntInfo->{'u_loanList'}->{'NumOfOverdue'}> 0 ||
                                $userAcntInfo->{'u_odlList'}->{'numTrans_lost'} > 0 ||
                                $userAcntInfo->{'u_odlList'}->{'numTrans_damage'} > 0 ||
                                $userAcntInfo->{'u_odlList'}->{'numTrans_damage'} > 0 ||
                                $userAcntInfo->{'u_odlList'}->{'numTrans_od'} > 0 ) ? 1:0,
        eq_transList_od       => to_json($userAcntInfo->{'equipment'}->{'transList_od'}) ,
        eq_loanList           => to_json($userAcntInfo->{'equipment'}->{'loanList'}) ,
        eq_numTrans_od        => $userAcntInfo->{'equipment'}->{'numTrans_od'} || 0 ,
        equipmentInfo_show=> ($userAcntInfo->{'equipment'}->{'loanCount'}>0)?1:0,
        tb_transList_od   => to_json($userAcntInfo->{'textbook'}->{'transList_od'}) ,
        tb_loanList       => to_json($userAcntInfo->{'textbook'}->{'loanList'}) ,
        tb_numTrans_od        => $userAcntInfo->{'textbook'}->{'numTrans_od'} || 0 ,
        textbookInfo_show  => ($userAcntInfo->{'textbook'}->{'loanCount'}>0)?1:0,

    );
   $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'},
        #program             => $userInfo->{'program'},
        #studies             => $userInfo->{'studies'},
        #notes               => $userInfo->{'notes'},
        #email               => $userInfo->{'email'},
        #address             => $userInfo->{'addrLine1'},
        #city                => $userInfo->{'city'},
        #state               => $userInfo->{'state'},
        block               => $userInfo->{'status'}==1 ? 0:1,
        zip                 => $userInfo->{'zip'},
        hasBalance          => ($balance>0)? 1:0,
        hasRefund           => ($balance<0)? 1:0,
        isShowBalance       => $isShowBalance,
        balance             => $balance,
        lost                => (circ_GetLostNumber($dbh, $userInfo->{'uid'})),
        damaged             => (circ_GetDamagedNumber($dbh, $userInfo->{'uid'})),
        hiddenid            => $userInfo->{'uid'},
        guardian            => $userAcntInfo->{'u_guardian'},
        loanListStat        => $userAcntInfo->{'u_loanList'}->{'loanListStat'},
        total               => $userAcntInfo->{'u_loanList'}->{'total'},
        #loanList            => $userAcntInfo->{'u_loanList'}->{'loanList'},
        LoanCount           => $userAcntInfo->{'u_loanList'}->{'LoanCount'},
        NumOfOverdue        => $userAcntInfo->{'u_loanList'}->{'NumOfOverdue'},
        LastLoanDate        => $userAcntInfo->{'u_loanList'}->{'LastLoanDate'},

        transList_lost      => $userAcntInfo->{'u_odlList'}->{'transList_lost'},
        numTrans_lost       => $userAcntInfo->{'u_odlList'}->{'numTrans_lost'},
        
        transList_damage    => $userAcntInfo->{'u_odlList'}->{'transList_damage'},
        numTrans_damage     => $userAcntInfo->{'u_odlList'}->{'numTrans_damage'},

        transList_od        => $userAcntInfo->{'u_odlList'}->{'transList_od'},
        numTrans_od         => $userAcntInfo->{'u_odlList'}->{'numTrans_od'},

        numTrans            => $userAcntInfo->{'u_odlList'}->{'numTrans'},
        showLostDamagedOd   => ($userAcntInfo->{'u_odlList'}->{'numTrans'}>0)?1:0,

        transList_pmt       => $userAcntInfo->{'u_transList'}->{'transList_pmt'},
        numPay              => $userAcntInfo->{'u_transList'}->{'numPay'},

        #reserveList         => $userAcntInfo->{'u_reserveList'}->{'reserveList'},
        NumOfReserves       => $userAcntInfo->{'u_reserveList'}->{'NumOfReserves'},
        paymentPerm         =>(defined $options && $options->{'paymentPerm'})?1:0,
        userEditPerm        =>(defined $options && $options->{'userEditPerm'})?1:0,
        patronItemPrivacy   =>(defined $options && $options->{'patronItemPrivacy'})?1:0,
    );
   
    my $msgValMap ={};
    my $stdMsgMap            =loc_getMsgFile('user/userInfo.msg',$msgValMap);
    loc_write($template,$stdMsgMap);
    my $userMsgMap            =loc_getMsgFile('js/msg.js',$msgValMap);
    loc_write($template,$userMsgMap);
     my $msgMap            =loc_getMsgFile('report/reports.msg',$msgValMap);
    loc_write($template,$msgMap);


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

    return $template->output;
}


#====================================================================================
sub getUserInfo{
    my ($dbh,$uid,$options)=@_;
    my ($userInfo, $guardian) = user_getInformationById($dbh, $uid);
    my $ret={};
    $ret  = { userInfo      => $userInfo,              
              u_guardian    => \@$guardian,
              u_loanList    => GetLoanItems($dbh,$uid,$options),
              u_reserveList => GetReservedItems($dbh,$uid,$options),
              u_odlList     => GetLostDamagedItems($dbh,$uid,$options ),  
              u_transList   => getPayRefFgv($dbh,$uid,$options)
            };
     
    return $ret;
}
#----------------------------------------------------------
sub GetLoanItems
{
    my ($dbh,  $uid,$options) = @_;
    my $ret={};
    # List items loaned by this borrower
    my ($loanListStat,$loanList, $reserveList);
     
    my ($sortTbl,$sortField) = ('','');
    if(defined $options && $options->{'tbSort'} ne '' && $options->{'fieldSort'} ne ''){
         ($sortTbl,$sortField) = ($options->{'tbSort'},$options->{'fieldSort'});
    }
    $loanListStat = ($sortTbl eq 'loanListStat' && $sortField ne '')? circ_userListLoanStat($dbh, $uid,$sortField):circ_userListLoanStat($dbh, $uid);
    $loanList     = ($sortTbl eq 'loanList'     && $sortField ne '')? circ_userListLoan($dbh, $uid,$sortField)    :circ_userListLoan($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'};
        }
    }
    $ret->{'loanListStat'}  = \@$loanListStat;
    $ret->{'total'}         = $total + scalar(@$loanList);
    $ret->{'loanList'}      = \@$loanList;
    $ret->{'LoanCount'}     = scalar(@$loanList);
    $ret->{'NumOfOverdue'}  = $odCount;
    if ( $lastloanDate eq '' ){
        $ret->{'LastLoanDate'}="none";
    }
    else  {
        $ret->{'LastLoanDate'}= date_text($lastloanDate, 0) ;
    }
    return $ret;    
}
#----------------------------------------------------------
sub GetLostDamagedItems
{
    my ($dbh, $uid) = @_;
    my $ret={};
    my $dir ='desc';
    my $balance = trans_getBalance($dbh,$uid);
    $ret->{'balance'}= $balance;

#   *NOTE* refer transaction codes from opl_transcode
#   1:overdue; 2:lost ; 3: damaged

    my @transTbl_lost = trans_getODL($dbh,$uid,$dir,2);
    $ret->{'transList_lost'}=\@transTbl_lost;
    $ret->{'numTrans_lost'}=scalar(@transTbl_lost);

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

#----------------------------------------------------------
sub getPayRefFgv{
    my ($dbh, $uid) = @_;
    my $dir ='';
    my $ret={};
    my @transTbl_payment = trans_getPaymentList($dbh,$uid,$dir);    
    my $transMsg            =loc_getMsgFile('report/reports.msg',{});

    foreach my $t(@transTbl_payment){
        $t->{'resp'}="";
        if($t->{'description'} =~ m/(.*)( by )(.*)$/gi){
            $t->{'resp'} =$3;
        }
        $t->{'description'}=sprintf "%s %s ", $transMsg->{"transMsg_".$t->{'transCode'}}, $t->{'resp'};

    }
    $ret ={ transList_pmt  =>\@transTbl_payment,
            numPay         =>scalar(@transTbl_payment)
          };
   return $ret;
}

#----------------------------------------------------------
sub GetReservedItems{
    my ($dbh, $uid,$options) = @_;
    my ($sortTbl,$sortField) = ('','');
    if(defined $options && $options->{'tbSort'} ne '' && $options->{'fieldSort'} ne ''){
         ($sortTbl,$sortField) = ($options->{'tbSort'},$options->{'fieldSort'});
    }
    my $ret={};
    my $reserveList =($sortTbl eq 'reserveList' && $sortField ne '')? circ_userListReserve($dbh, $uid,$sortField):circ_userListReserve($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);
    }
    $ret={NumOfReserves=>scalar(@$reserveList),
          reserveList => $reserveList
         };
    return $ret;
}

sub getEquipmentInfo
{
    my ($dbh,$uid,$options) = @_;
    my $loanList = [];
    $loanList  = Opals::Eq_Circulation::circ_getUserListLoan($dbh,{uid=>$uid}) || [];
    my $odList = [];
    foreach my $l(@$loanList){
        if ($l->{'overdue'}){
            $l->{'titleSort'} = $l->{'rname'};
            push @$odList,$l;
        }
    }
    my $ret = { 
        'loanList'    => $loanList,
        'loanCount'   => scalar(@$loanList),
        'transList_od'=> $odList,
        'numTrans_od' => scalar(@$odList)
    };
    return $ret;
}

sub getTextbookInfo
{
my ($dbh,$uid,$options) = @_;
    my $loanList = [];
    $loanList = Opals::Tb_Circulation::circ_getUserListLoan($dbh,$uid) || [];
    my $odList = [];
    foreach my $l(@$loanList){
        if ($l->{'overdue'}){
            push @$odList,$l;
        }
    }
    my $ret = { 
        'loanList'    => $loanList,
        'loanCount'   => scalar(@$loanList),
        'transList_od'=> $odList,
        'numTrans_od' => scalar(@$odList)
    };
    return $ret;

}
#====================================================================================
