#!/usr/bin/perl

use strict;
use CGI;

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

);

use Opals::Eq_SolrSearch;

use Opals::Equipment qw(

    eq_defRecord_getList
    eq_defRecord_getLists
    eq_defItem_getList
    eq_defItem_getLists

    eq_definition_getList

    eq_item_find
    eq_record_find
    eq_record_delete
    srch_equipment

);

use Opals::Eq_Circulation qw(
    
    circ_infoRecord
    circ_getItemStatus
);

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/report/equipmentList.tmpl',
    }
);

my $kw          = $input->{'kw'};
my $sfield      = $input->{'sfield'};
my $sortAttr    = $input->{'sortAttr'};
my $sortOrder    = $input->{'sortOrder'};
if (!$sortAttr){
       $input->{'sortAttr'} = $sortAttr = 'eq_name';
    }

my $recPerPage =  $input->{'rpp'};
   ($recPerPage && $recPerPage >= 1) || ($recPerPage =1 ) ;

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

my $defList = eq_definition_getList($dbh,$sfield);
my $defRecList      =  eq_defRecord_getList($dbh);
my $defItemList      = eq_defItem_getList($dbh);

foreach my $defRec(@$defRecList){
    $defRec->{'sortField'} = 0;
    if ($defRec->{'id'} == $sortAttr){
        $defRec->{'sortField'} = 1;
    }
}


my $pRange = 5;
my $pSize = 10; #$recPerPage ;
my $curPage = $input->{'pNum'};
my $offset;

my $recordList = [];

($curPage && $curPage >= 1) || ($curPage = 1);
$offset = ($curPage - 1) * $pSize;
$input->{'offset'} = $offset;

$template->param(
    sKw     =>  $kw,
    sfield  =>  $sfield,
    pNum    =>  $curPage,
);

writeSortParam2Tmpl();

my ($rs,$hits,$recList,$categoryFacetList);
if ($permission && $permission->{'eq_record_edit'} ) {
    if (defined $sfield && $kw){
      my $eq_solr = Opals::Eq_SolrSearch->new(dbh=>$dbh);
      my $lQuery = $eq_solr->eq_slr_buildSearchQuery($input);
      $rs = $eq_solr->eq_slr_search( {lQuery=>$lQuery});
      ($hits,$recordList,$categoryFacetList) = ($rs->{'hits'},$rs->{'recordList'},$rs->{'categoryFacetList'});
      $recordList  = addHoldingInfo($dbh, $rs->{'recordList'} ) ;
    }


my $recTo   = $offset + $pSize;
if ($recTo > $hits){
    $recTo = $hits
}

my @rangedPageList = tmpl_rangedPageList($hits, $curPage, $pSize, $pRange);
    $template->param(
        defList         =>  $defList,
        defRecList      =>  $defRecList, 
        defItemList     =>  $defItemList,   
        kw              =>  $kw,
        recFrom         =>  $offset,
        recTo           =>  $recTo,
        recordList      =>  $recordList, 
        hits            =>  $hits,
        rppIndex        =>  int($recPerPage) - 1,
        rpp             =>  $recPerPage,
        rec_start       =>  $offset + 1,
        rec_end         =>  $offset + scalar(@$recordList),
        resultSize      =>  $hits,
        rangedPageList  =>  \@rangedPageList,
        searchType      =>  "searchWtBc",
        result          =>  (scalar(@{$recordList})>0)?1:0,
    );
    if ($permission && $permission->{'equipment_mngt'}) {
        $template->param(    eqmntMgmt      => 1);
    }
}


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 ,
    );
}

sub  addHoldingInfo{
    
    my ($dbh, $recordList) = @_;
    my $rCount = 0;

    my $sth_items = $dbh->prepare(<<_SQL_);
select * from eq_items where rid = ? && barcode not regexp '^\_\_\_'
_SQL_

   foreach my $rec (@{$recordList}){
        my @itemList = ();   
        $sth_items->execute($rec->{'rid'});
        if ($rec){
            while (my $item = $sth_items->fetchrow_hashref){
                my $itemCircStatus =  circ_getItemStatus($dbh,{barcode=>$item->{'barcode'}});
                my ($itemStatus,$colorStyle,$fontStyle)  =  getStyleByStatus($itemCircStatus->{'status'});
                $item->{'status'} = $itemStatus; 
                $item->{'colorStyle'} = $colorStyle;
                $item->{'fontStyle'} = $fontStyle;
                my @sfields = getItemSubFieldInfo($dbh, $rec->{'rid'},$item->{'iid'});
                $item->{'sfields'} = \@sfields;
                push @itemList, $item;
            }
        }
        else{
            my @sfields = getItemSubFieldInfo($dbh, $rec->{'rid'},0);
            my $item  = {
               barcode => "",
               sfields => \@sfields,
            };
            push @itemList,$item;
        }
        $rec->{'items'} = \@itemList;
        $rec->{'iCount'} = (scalar(@itemList))> 0? scalar(@itemList):1;
    }
    $sth_items->finish;
    return $recordList;
}

sub getStyleByStatus {
     
    my ($statusCode) = @_;
    my ($itemStatus,$colorStyle,$fontStyle) = ('available','green','normal');

    if($statusCode == 2){
        ($itemStatus,$colorStyle,$fontStyle) = ('reserved','brown','bold');
    }
    elsif($statusCode == 3){
        ($itemStatus,$colorStyle,$fontStyle) = ('on loan','brown','bold');
    }
    elsif($statusCode == 4){
        ($itemStatus,$colorStyle,$fontStyle) = ('overdue','brown','bold');
    }
    elsif($statusCode == 5){
        ($itemStatus,$colorStyle,$fontStyle) = ('on hold','brown','bold');
    }
    elsif($statusCode == 7){
        ($itemStatus,$colorStyle,$fontStyle) = ('lost','brown','bold');
    }
    elsif($statusCode == 8){
        ($itemStatus,$colorStyle,$fontStyle) = ('damage','brown','bold');
    }
    elsif($statusCode == 10){
        ($itemStatus,$colorStyle,$fontStyle) = ('restricted','brown','bold');
    }
    elsif($statusCode == 11){
        ($itemStatus,$colorStyle,$fontStyle) = ('missing','brown','bold');
    }
   
   return ($itemStatus,$colorStyle,$fontStyle) ;
}


sub getItemSubFieldInfo {

   my ($dbh,$rid,$iid) = @_;
   my $query = "select f.sfValue as val from eq_def d 
               left outer join eq_itemFields f on d.id = f.sfId
               && f.rid = ? && f.iid = ? 
               where d.defType = 'item' && d.display = 1
               order by d.fOrder" ;
   my $sth = $dbh->prepare($query);
   $sth->execute($rid,$iid);
   my @retVal = ();
   while ( my $sf = $sth->fetchrow_hashref()){
      push @retVal, {
         val   => $sf->{'val'} ,
      };
   }
   $sth->finish;

   return @retVal;
}


