#!/usr/bin/perl

#use utf8;
use strict;
use CGI;
use JSON;

use Opals::Context;
use Opals::Template qw(
    tmpl_read
    tmpl_write
);
use Opals::Report qw(
    rpt_circTrans
    rpt_holdTrans
    rpt_itemRecord
);
use Opals::MarcXmlParser;
use Opals::Date qw(
    date_text
);
use POSIX qw(
    ceil
);

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

    my $cgi      = CGI->new;
    my $input    = $cgi->Vars();
    my $op       = $input->{'op'} || "view";
    my $dateFrom = $input->{'dateFrom'};
    my $dateTo   = $input->{'dateTo'} ;
    my $transType= $input->{'transType'};  
    my $pSize    = $input->{'pSize'}||25; 
    my $pNo      = $input->{'pNo'}||1; 
    my $offset=($pNo-1)*$pSize;
    my @itemTypeList= $cgi->param('itemType');
    if($op eq 'view'){
        getReport4View($dbh,$transType,$dateFrom,$dateTo,\@itemTypeList,$offset,$pSize)
    }
    else{
        getReportAsCSV($dbh,$transType,$dateFrom,$dateTo,\@itemTypeList);
    }


 
#------------------------------------------------------------------------------


sub getReport4View{
    my($dbh,$transType,$dateFrom,$dateTo,$itemTypeList,$offset,$pSize)=@_;
    my $rs={};
    if($transType eq 'circ'){
        $rs = rpt_circTrans($dbh,$dateFrom,$dateTo,$offset,$pSize);
    }
    elsif($transType eq 'hold'){
        $rs = rpt_holdTrans($dbh,$dateFrom,$dateTo,$offset,$pSize);
    }
   elsif($transType eq 'itemRecord'){
        $rs = rpt_itemRecord($dbh,$itemTypeList,$offset,$pSize);
    }

    my $marcXmlParser=Opals::MarcXmlParser->new();
    foreach my $t(@{$rs->{'transList'}}){
        my $rec = $marcXmlParser->getRecInfoGeneral(getRecordXml($t->{'rid'}));
         if($rec){
            $t->{'title'}=$rec->{'title'};
            $t->{'author'}=$rec->{'author'};
            $t->{'pubDate'}=$rec->{'datePublication'};
            $t->{'pubPlace'}=$rec->{'placePublication'};
            $t->{'pubName'}=$rec->{'namePublisher'};
            my @isbnList=();
            foreach my $e(@{$rec->{'isbn'}}){
                push @isbnList,$e->{'item'};
            }
            $t->{'isbn'}=join(",", @isbnList);
        }

    }
    my $rsJSON = to_json($rs,{pretty=>1});

    print "Content-type: text/plain\n\n";
    print  $rsJSON;

}

#------------------------------------------------------------------------------
sub getReportAsCSV{
    my($dbh,$transType,$dateFrom,$dateTo,$itemTypeList)=@_;
    my  $fm={circ=>{
                fileName=>"transaction-data.csv",
                cols=>["Barcode","Borrowing Branch Code",  "Owning Branch Code","Other Branch Code related to the transtion", "Item Status", "Transaction Date and Time", "Transaction Type"],
                fields=>["barcode", "libCode", "libCode", "otherLibCode","itemStatus", "transDate", "transType"]
                },
             hold=> {
                fileName=>"holds-data.csv",
                cols=>["Bib ID","Branch Code","ISBN", "Current Holds","Author","Title" ],
                fields=>["rid","libCode","isbn","currentHolds","author","title"]
             },
             itemRecord=>{
                 fileName=>"itemRecord.csv",
                 cols=>["Bib ID","Barcode","Owning Branch Code","Checkout Location","Checkout Branch Code","Last Circulation Date","Toal Circulation Count","Last Renewal Date","Total Renewal Count","Item Format/Binding","Item Status Code", "Date Created", "Price","Call Number","Collection Code"],
                 fields=>["rid","barcode","libCode","chkoutLoc","libCode","lastCircDate","circCount","lastRenewalDate","renewalCount","recFormat","itemStatus","dateImport","price","callNumber","location"]
             }

            };
    my $rs={};  
    my $cols=$fm->{$transType}->{'cols'};
    my $fields=$fm->{$transType}->{'fields'};
    my $fileName=$fm->{$transType}->{'fileName'};

    if($transType eq 'circ'){
        $rs = rpt_circTrans($dbh,$dateFrom,$dateTo);
    }
    elsif($transType eq 'hold'){
        $rs = rpt_holdTrans($dbh,$dateFrom,$dateTo);
    }
   elsif($transType eq 'itemRecord'){
        $rs = rpt_itemRecord($dbh,$itemTypeList);
    }
    print "Content-Encoding: UTF-8\n";
    print "Content-type: text/csv; charset=UTF-8\n";
    print "Content-Disposition:attachment;filename=" , $fileName . "\n\n"; 
    print join(",",@$cols),"\n";
    foreach my $r(@{$rs->{'transList'}}){
        my @rData=();
        foreach my $f(@$fields){
            push @rData, "\"" . $r->{$f} ."\"";
        }
        print join(",",@rData), "\n"
    }


}
#------------------------------------------------------------------------------

sub getRecordXml {
    my ($rid) = @_;
    
    my $zRoot   = Opals::Context->config('zRoot');
    my $zPort   = Opals::Context->config('zPort');
    my $zDatabase = Opals::Context->config('zDatabase');
    my $fname     = "$zRoot/$zPort/record/$zDatabase/" . ceil($rid/1000) ."/$rid.xml";
    my $xml="";
    if(-f $fname){
        open FILE,"<$fname";
        while(<FILE>){
            $xml .=$_;
        }
        close FILE;
    }
    return $xml;

}




#------------------------------------------------------------------------------


