#!/usr/bin/perl

#use utf8;
use strict;
use CGI;
use POSIX qw(
    floor
);
use Date::Calc qw(Day_of_Week Week_Number Day_of_Year);
use Opals::Date qw(
    date_parse
    date_today
    date_text
    date_f005
);

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

use Opals::Report qw(
    getAverageCopyrightDate 
     _splitDeweyNumber
     _first_digit_matched
     _first_two_digits_matched    
    _first_digit_unmatched
     createRegExp

);
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 $op = $input->{'op'};
my ($permission, $cookieList, $template) = tmpl_read(
    {
        dbh             => $dbh,
        cgi             => $cgi,
        tmplFile        => 'report/avgCpyDate.tmpl',
#        reqPermission   => 'reqPermission1|reqPermission2|etc.',
#        op              => $op,
    }
);
$template->param(hlpUrl     => Opals::Constant->getHlpUrl('avgCpyDate') );
    my $f_Val     = $input->{'from'};
    my $t_val     = $input->{'to'};
    my $searchOpt = $input->{'searchOpt'};
    my ($avgYear, $recordCount, $holdingCount);
    my @report;
    my $filterBy = $input->{'filterBy'};;
    my $cDewey;
    my ($deweFrom,$deweyTo);
    #my ($begin,$end)=($deweFrom,$deweyTo);

    my $dateToday = date_f005();
    $dateToday =~ s/([\d]{4})([\d]{2})([\d]{2})[\d]+\.(0|1)/$1-$2-$3/;
    my $dateFrom= $input->{'dateFrom'};
    my $dateTo  = $input->{'datetTo'};
    my $dateRange= $input->{'dateRangeOpt'};
    if ($dateRange eq "all"){
        $dateFrom= "1970-01-01";
        $dateTo  = $dateToday;
    }
    $dateFrom = $dateToday if ( !$dateFrom );
    $dateFrom .= " 00:00:00";
    $dateTo = $dateToday if ( !$dateTo );
    $dateTo .= " 23:59:59";
     
    my $regexp;
    if ($f_Val){
        if ($searchOpt eq 'Dewey'){
            $deweFrom=int $f_Val;
            $deweyTo =int $t_val;
        }
        else{
            $t_val = '999';
            ($deweFrom,$deweyTo)=(0,999);
        }
       
       
        my ($begin,$end)=($deweFrom,$deweyTo);
        for(my $d =$deweFrom; $d <$deweyTo ;){
            if($d<10){
                $cDewey="00$d";
            }
            elsif($d<100){
                $cDewey="0$d";
            }
            $end=$filterBy * floor(($begin+$filterBy)/$filterBy) -1;
            $end =$t_val if($end >$t_val);
           
            $regexp = createRegExp($begin, $end);

            ($avgYear, $recordCount, $holdingCount) =
            getAverageCopyrightDate($dbh,$regexp,$f_Val,$searchOpt);
            for( my $i=length($begin); $i<3 ;$i++){
                $begin = "0" . $begin ;
            }
            for( my $i=length($end); $i<3 ;$i++){
                $end = "0" . $end ;
            }
             
            if($avgYear >0){
                push @report, {deweyRangeB=>$begin,deweyRangeE=>$end,avgYear=>$avgYear,
                        recordCount=>$recordCount, holdingCount=>$holdingCount};
            }
            $begin=$end +1 ;
             $d =$begin;
        }

      
        
        if ($searchOpt eq 'Prefix'){
        # CASE: out of range ($begin, $end)
            $regexp = 'outofrange';
            ($avgYear, $recordCount, $holdingCount) =
            getAverageCopyrightDate($dbh,$regexp,$f_Val,$searchOpt);
            
            if($avgYear >0){
                push @report, {outDeweyRange=>1,avgYear=>$avgYear,
                        recordCount=>$recordCount, holdingCount=>$holdingCount};   
            }
        }
    }
    
 
    $template->param(
        avgYearReport =>\@report,
        #avgYear      => $avgYear,
        #recordCount  => $recordCount,
        #holdingCount => $holdingCount,
    );
    
    if($searchOpt eq 'Prefix'){
        $template->param(
            from       => $f_Val,
            prefixSel  => 1,
            searchOpt  =>"Prefix"
       );
    }
    else{
        $template->param(
            from       => $f_Val,
            to         => $t_val,
            deweySel   => 1,
            searchOpt  =>"Dewey"
       );
    }

    
    if($filterBy eq '10'){
        $template->param(
            call10Sel => 1,
            filterBy   =>"10"
       );
    }
    else{
        $template->param(
            call100Sel  => 1,
            filterBy   =>"100"
       );
    }


    if($dateRange eq 'all'){
        $template->param(
             rangeAll    => 1,
            dateRangeOpt =>"all"
       );
    }
    elsif($dateRange eq 'fYear'){
        $template->param(
            dfrom        => substr($dateFrom, 0, 10),
            dto          => substr($dateTo, 0, 10),
            rangeFYear   => 1,
            dateRangeOpt =>"fYear"
       );
    }
    else{
        $template->param(
            dfrom       => substr($dateFrom, 0, 10),
            dto         => substr($dateTo, 0, 10),
            rangeSel    => 1,
            dateRangeOpt=>"rangeSel"
       );

    }

#Tue, Jan 12, 2010 @ 10:31:41 EST
my $msgValMap ={};
my $msgMap            =loc_getMsgFile('report/reports.msg',$msgValMap);
loc_write($template,$msgMap);

tmpl_write($dbh, $cgi, $cookieList, $template);
#$dbh->disconnect();
################################################################################


sub getAverageCopyrightDate_bk {
    my ($dbh, $f_Val, $t_Val, $searchOpt) = @_;
    my $regexp;
    if ($searchOpt eq 'dewey'){
        $regexp = createRegExp($f_Val, $t_Val);
#        my ($f1 ,$f2, $f3, $t1 ,$t2, $t3);
#        $f_Val =~ m/^([\d])([\d])([\d])$/;
#        ($f1 ,$f2, $f3) = ($1,$2,$3);
#
#        $t_Val =~ m/^([\d])([\d])([\d])$/;
#        ($t1 ,$t2, $t3) = ($1,$2,$3);
#
#        $regexp = '';
#        
#        for (my $i = $f_Val; $i <= $t_Val; $i++) {
#            $regexp .= $i .'|';
#        }
#        $regexp =~ s/\|$//;
    }
    else{
        $regexp = $f_Val;
    }
    my $sql = <<_STH_;    
select  R.pubDate, count(distinct I.rid) as cRecord, count(I.rid) as cHolding
from    opl_item as I
right
join    opl_marcRecord as R
on      I.rid = R.rid
where   callNumber regexp '(^| )($regexp)'
 && R.pubDate is not null
group by R.pubDate
_STH_
 
    
    my $sth = $dbh->prepare($sql);
    $sth->execute();
    my ($date, $cRecord, $cHolding, $sumYear, $recordCount, $holdingCount);
    $sumYear      = 0;
    $recordCount = 0;
    $holdingCount = 0;
    my $dewey;
    while (($date, $cRecord, $cHolding) = $sth->fetchrow_array) {
        $dewey =~  m/(^| )([\d]{2})/;
        $dewey =$2;
        $date =~ s/^([\D]*)([\d]{4}).*$/$2/;
        if ($date =~ m/^[\d]{4}$/) {
            $sumYear      += $date * $cRecord;
            $recordCount += $cRecord;
            $holdingCount += $cHolding;
        }
    }
    $sth->finish;

    return ($recordCount) ?
        (floor($sumYear/$recordCount + 0.5), $recordCount, $holdingCount) : (0, 0, 0);
}

