#!/usr/bin/perl

use strict;
use CGI;

use Opals::Context;
use Opals::Template qw(
    tmpl_read
    tmpl_write
    tmpl_rangedPageList
    tmpl_redirect
);

use Opals::Eq_Search qw(
      
    eq_category_getList
    eq_category_getListById
    eq_search_cat
    eq_search
    eq_search_countByCat

);
use Opals::Equipment qw(

    eq_defRecord_getList
    eq_defRecord_getLists
    eq_defItem_getList
    eq_defItem_getLists
    eq_record_delete

);

use Opals::Eq_Circulation qw(
    
    circ_infoRecord
);

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, $cookieList, $template) = tmpl_read(
    {
        dbh             => $dbh,
        cgi             => $cgi,
        tmplFile        => 'eqmnt/searchCat.tmpl',
    }
);
################################################################################
# Delete Record
if ($permission && $ENV{'REQUEST_METHOD'} =~ m/^post$/i && $input->{'op'} eq 'delRec') {
    my $rid = $input->{'rId'};
    eq_record_delete($dbh, $rid) if ($rid ne '' && $rid > 0);
}
################################################################################
my $kw          = $input->{'kw'};
my $cat         = $input->{'cat'} || 0;
my $searchByCat = $input->{'searchByCat'};
my $field       = $input->{'field'};
my ($type,$sF,$reqF) = split(/:/, $field);
my $exactmatch = $input->{'exactmatch'} || 0;


my $srchCatId   = eq_category_getListById($dbh,$cat);
my $defRecList  = eq_defRecord_getList($dbh);
my $defRecLists = eq_defRecord_getLists($dbh);
my $defItemLists= eq_defItem_getLists($dbh);

my $sortAttr    = $input->{'sortAttr'};

my $sortOrder = $input->{'sortOrder'};
   ($sortOrder && $sortOrder >=1) || ($sortOrder = 1);
my $resultOrder = $sortOrder;

my $pRange = 5;
my $pSize = 10;
my $curPage = $input->{'pNum'};
my $offset;
my ($resultSize, $recordList) ;
($curPage && $curPage >= 1) || ($curPage = 1);
$offset = ($curPage - 1) * $pSize;


my @rangedPageList = tmpl_rangedPageList($resultSize, $curPage, $pSize, $pRange);
my $categoryList = eq_category_getList($dbh);

my @cat1;
foreach my $c (@{$categoryList}){
    push @cat1,$c;
    foreach my $cc (@{$c->{'children'}}){
        push @cat1, $cc;
    }
}

my $catHash;
my $catSelected="";
foreach my $c (@cat1){
    $catHash->{$c->{'id'}} = $c->{'name'};
    $c->{'select'} = 0;
    if ($c->{'id'} == $cat){
        $c->{'select'} = 1;
        $catSelected = $c->{'name'};
    }
}
$template->param(
    sKw         =>  $kw,
    pNum        =>  $curPage,
    sfIndex     =>  ($input->{'field'})?$input->{'field'}:0 ,
    sField      =>  $field,
    categoryList=>  \@cat1,
    categoryGroup=> $categoryList,
    catSelected =>  $catSelected,
    cat         =>  $cat,
    exactMatch  => $exactmatch
);

writeSortParam2Tmpl();


if ($kw && $srchCatId) {
    if ($srchCatId && $srchCatId ne "" && scalar(@$srchCatId) > 0 ){
        ($resultSize, $recordList) = eq_search_cat($dbh,$srchCatId,$field,$kw,$offset,$pSize,$resultOrder,$sortAttr,$exactmatch
);
    }
    else {
        ($resultSize, $recordList) = eq_search($dbh,$srchCatId,$field,$kw,$offset,$pSize,$resultOrder,$sortAttr,$exactmatch);
    }

    if(defined $kw && $kw ne '' && $resultSize > 0 ){
        $template->param(  hasResult =>1);
    }
    else{
        $template->param(  hasNoResult =>1);
    }
}
my $result = ($resultSize > 0)? 1:0;

foreach my $r(@$recordList){
    my @cat = split(/,/, $r->{'category'});
    if (!@cat ){
        $r->{'cat'} = '-';
    }
    else{
        foreach my $c (@cat){
            $r->{'cat'} .= $catHash->{$c} . ",";
        }
            $r->{'cat'} =~ s/,$//;
    }
    my ($numTotal,$numLoan,$numReserve,$numHold,$itemList,$totalCirc,$totalMissing,$totalDamaged,$totalLost) = circ_infoRecord($dbh, $r->{'rid'});
        
       $r->{'numTotal'}        = $numTotal;
       $r->{'numLoan'}         = $numLoan;
       $r->{'numReserve'}      = $numReserve;
       $r->{'numHold'}         = $numHold;
       $r->{'numReserveTotal'} = $numReserve + $numHold;
       $r->{'numAvailable'}    = $numTotal - $numLoan - $numHold - $totalMissing - $totalDamaged - $totalLost;
       $r->{'available'}       = ($numTotal - $numLoan - $numHold - $totalMissing - $totalDamaged - $totalLost) > 0? "Available" :"On Loan"
}
if ($resultSize - $offset + 1 <= 0){
    my $availRange = $resultSize % $pSize;
    $availRange = $pSize if ($availRange == 0); 
    $offset = $resultSize - $availRange + 1;
    $curPage = ($offset - 1) / $pSize + 1;
}

my @rangedPageList = tmpl_rangedPageList($resultSize, $curPage, $pSize, $pRange);

$template->param(
    defRecList      =>  $defRecList, 
    defRecLists     =>  $defRecLists,
    defItemLists    =>  $defItemLists,
    recordList      =>  $recordList, 
    rec_start       =>  $offset + 1,
    rec_end         =>  $offset + scalar(@{$recordList}),
    result          =>  $result,
    resultSize      =>  $resultSize,
    rangedPageList  =>  \@rangedPageList,
);

$template->param(
    rangedPageList  =>  \@rangedPageList,
);

if ($permission && $permission->{'equipment_mngt'}) {
    $template->param(    eqmntMgmt      => 1);

}

my $msgValMap={} ;

my $stdMsgMap  =loc_getMsgFile('/search/standard.msg',$msgValMap);
loc_write($template,$stdMsgMap);
tmpl_write($dbh, $cgi, $cookieList, $template);

#-----------------------------------------------------------------------
sub writeSortParam2Tmpl{
    
    $template->param(
        sortOrder       => $sortOrder,
        sortAttr        => $sortAttr,
        sortRName       => ($sortAttr ne "" && $sortAttr < 0)? 1:0,
        sortOrderReverse    => ($sortOrder && $sortOrder == 1)  ? 2 : 1,
        sortDown        => ($sortOrder && $sortOrder == 1)  ? 0 : 1 ,
        sortField       =>  $sortAttr ,
        searchByCat     => ($searchByCat) ? 1:0,
        cat             => $cat
    );
}

