#!/usr/bin/perl

#use utf8;
use strict;
use CGI;

use Opals::Context;

use POSIX qw(
    floor
);

use Time::localtime;
use Opals::Constant;

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

use Opals::Tb_Search qw(
    
    search_record
    search_record_byBarcode
    search_record_byRId
    search_record_2Prt
    
);

use Opals::Tb_Circulation qw(

    circ_infoRecord

);

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/printTitles.tmpl',
            #reqPermission   => 'tb_report',
        }
);
my $syspref = tmpl_preference($dbh);
my @cookieList = ($cookie);
my $tm = localtime;
my $todayStr = sprintf("%04d-%02d-%02d", $tm->year+1900, ($tm->mon)+1, $tm->mday);
my ($bc,$rid,@ridArr, @ncrArr,$op, $dateExpiry);
  
my $rIdList  = $input->{'rid'} ;
$rIdList =~ s/[^\d,]//g;

my $opt         = $input->{'opt'};
my $prtType     = $input->{'prtType'};
my $kw          = $input->{'kw'};
my $sfCode      = $input->{'sfCode'};
my $sortAttr    = $input->{'sortAttr'};
    if (!$sortAttr ){
        $sortAttr = '245_a';
    }


#($sField && $sField =~ m/^(title|author|callnumber|barcode)$/i) || ($sField = 'barcode');

my $sortOrder   = $input->{'sortOrder'};
if (!$sortOrder ) {
        $sortOrder == 0;
    }


my ($resultSize, $recordList);


my $pRange = 5;
my $pSize = 10;
my $curPage = $input->{'pNum'};
my $opt = "all";
my $offset = 0;
    ($curPage && $curPage >= 1) ||($curPage = 1 );
    $offset = ($curPage - 1 ) * $pSize;


    if ($rIdList && $rIdList ne "all"){
        my @rIdList = split(/,/, $rIdList);
        ($resultSize, $recordList) = search_record_byRId($dbh,$rIdList);
    }
    else{
        ($resultSize, $recordList) = search_record_2Prt($dbh,$sfCode,$kw,$sortOrder,$sortAttr);
    }
    foreach my $record(@$recordList){
        my ($numTotal, $numLoan, $numReserve, $numHold, $itemList,$totalCirc) = circ_infoRecord($dbh, $record->{'rid'});
           $record->{'numTotal'}        = $numTotal;
           $record->{'numLoan'}         = $numLoan;
           $record->{'numReserve'}      = $numReserve;
           $record->{'numHold'}         = $numHold;
           $record->{'numReserveTotal'} = $numReserve + $numHold;
           $record->{'numAvailable'}    = $numTotal - $numLoan - $numHold;
    }


    if ($prtType eq "csv") {
        saveResult2CSV($recordList );
    }
    else{
        $template->param(
            recMod_msg_12   => "Print Label Set",
            recMod_msg_13   => "Print Barcode Labels",    
            recMod_msg_14   => "Print Spine Labels",
            wLocaTxt        => "With Location",
            woLocTxt        => "Without Location",
            recMod_msg_15   => "Labels with title, author, call number",
            recMod_msg_16   => "Labels with library/school name",
            prt_Opt01       => "8 across, 6 down.",
            prt_Opt02       => "8 across, 6 down.(landscape) ",
            prt_Opt03       => "3 Across, 10 down.",
            prt_Opt04       => "Horizontal Align",
            prt_Opt05       => "Left",
            prt_Opt06       => "Center",
            recMod_msg_19   => "Starting row",
            recMod_msg_20   => "Starting column",
            prtSelTxt       => "Print",
        );
        $template->param(
            resultSize      =>  $resultSize,
            recordList      =>  $recordList,
            rec_start       =>  $offset + 1,
            rec_end         =>  $offset + scalar(@{$recordList}),
        );
        $template->param(
            kw             =>  $kw,
            pNum            =>  $curPage,
            sfCode          =>  $sfCode?$sfCode:'000_a',
            sfIndex         =>  ($input->{'sfIndex'})? $input->{'sfIndex'}:0,
            sortAttr        =>  $sortAttr,
            sortOrder       =>  $sortOrder,
            sortOrderReverse=> ($sortOrder && $sortOrder == 1)  ? 2 : 1,
            sortTitle       => ($sortAttr eq '245_a')           ? 1 : 0,
            sortAuthor      => ($sortAttr eq '100_a')           ? 1 : 0,
            sortISBN        => ($sortAttr eq '020_a')           ? 1 : 0,
            sortPubDate     => ($sortAttr eq '260_c')           ? 1 : 0,
            sortDown        => ($sortOrder && $sortOrder == 1)  ? 1 : 0,
            opt             => $opt,
            rid             => $rIdList
        );
        tmpl_write($dbh, $cgi, \@cookieList, $template);
    }
################################################################################
sub item_findByRId{

    my ($dbh,$rid, $order) = @_;
    my @itemList;
    return undef if ($rid eq '');
    my $sql = " SELECT * FROM tb_items where rid = ? && deleted <> '1' && barcode not regexp '^\_' order by length(barcode) , barcode ";
    if ($order) {
        $sql .= $order ;
    }

    my $sth = $dbh->prepare($sql);
    $sth->execute($rid);
    my $i =0;
    
      
    while (my $it = $sth->fetchrow_hashref()){
        $it->{'i'} = $i++;
        $it->{'order'} = $i;
        $it->{'vendorCatalogNo'}= $it->{'vendorCatalogNumber'};
        $it->{'poNo'}           = $it->{'PONumber'};
        $it->{'acqDate'}        = $it->{'acquisitionDate'};
        $it->{'classNo'}        = $it->{'classNumber'};
        push @itemList, $it;
    }


my $sth_status = $dbh->prepare(<<_STH_);
select  barcode, status
from    tb_itemStatus
where   barcode = ? && status <> ?
        order by ondate desc
        limit 0,1
_STH_

$sth = $dbh->prepare(<<_STH_);
select  dateDue, TIMEDIFF(now(), dateDue) as deltaDateDue 
from    tb_loan where barcode = ? && 
        dateReturn is null 
_STH_

    my $ddd=0;
    my ($mBc, $status);
    foreach my $i(@itemList){
        $sth_status->execute($i->{'barcode'},ITEM_NEW) || return;
        ($mBc, $status) = $sth_status->fetchrow_array;
        if ($mBc && $status == ITEM_INACTIVE){
            $i->{'missing'} = 1;    }
        elsif ($status == ITEM_DAMAGED){
            $i->{'damaged'} = 1;    }
        elsif ($status == ITEM_LOST ){
            $i->{'lost'} = 1;   }
        else{
             $sth->execute($i->{'barcode'}) || return;
            ($i->{'dateDue'}, $ddd) = $sth->fetchrow_array;
            if ($i->{'dateDue'}){
                $i->{'loan'} = 1;
            }
        }
        my $status = ($i->{'loan'})?"loan":"avail";
        $i->{'status'} = $status;
    }
    $sth_status->finish;

    $sth->finish;
    return \@itemList;
}

sub saveResult2CSV {
    my ($recordList) = @_;

    print "Content-Type:application/x-download\n";
    print "Content-Disposition:attachment;filename=titleList.csv\n\n";  

    my $header = "\"Id\", \"Title\", \"Author\", \"ISBN\", \"Publish Date\", \"Copies\", \"Available\" ";
    print "$header \n";
    my $str="";
    foreach my $r (@$recordList) {
        my $title = $r->{'title'};
        $title =~ s/\"//g ;
        my $author = $r->{'author'};
        $author =~ s/\"//g ;
        my $isbn = $r->{'isbn'};
        $isbn =~ s/\"//g ;
        my $pubDate = $r->{'pubDate'};
        $pubDate =~ s/\"//g ;
        $str = "\"" . $r->{'rid'} ."\",\"" . $title . "\",\"". $author . "\",\"". $isbn. "\",\"".$pubDate . "\",\"";
        $str .= $r->{'numTotal'}."\",\"". $r->{'numAvailable'} . "\"" ;
     
        print $str . "\n";
    }
    exit;
}



