#!/usr/bin/perl

#use utf8;
use strict;
use CGI;
use POSIX qw(
    ceil
);

use Opals::Context;#use MARC::File::USMARC;
#use MARC::File::XML;

use Opals::Template qw(
    tmpl_read
    tmpl_write
    tmpl_rangedPageList
    tmpl_searchFieldAdvance
);
use Opals::Search qw(
    srch_parseSearchTerm
    srch_searchRecord
    srch_exclusiveResultSize
    srch_zTab
    srch_zList
);
use Opals::Circulation qw(
    circ_infoRecord
);
use Opals::MarcXml qw(
    mxml_delete
);

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

my $cgi = CGI->new;
my $input = $cgi->Vars();
#open kkk, ">/tmp/kkk";
#print kkk $input->{'kw0'};
#close kkk;
my ($permission, $cookie, $template) = tmpl_read(
        {
            dbh             => $dbh,
            cgi             => $cgi,
            tmplFile        => 'search/subject.tmpl',
        }
);

################################################################################
# Delete Record
if ($permission && $permission->{'marc_edit'} && $ENV{'REQUEST_METHOD'} =~ m/^post$/i && $input->{'op'} eq 'delRec') {
    $template->param(
        remainList  =>  mxml_delete($dbh, $input->{'rid'}),
    );
}
#/Delete Record
################################################################################

my $self = $ENV{'SCRIPT_NAME'};
my @cookieList = (@$cookie);

# Cookie::showpqf
my $showpqf = $input->{'showpqf'};
($showpqf) || ($showpqf = $cgi->cookie('showpqf')) || ($showpqf = 0);
push @cookieList, $cgi->cookie(-name => 'showpqf', -value => $showpqf,);
$template->param('showpqf' => $showpqf,);

my $zid = $input->{'zid'};
($zid && $zid =~ m/^[\d]+$/ && $zid >= 0) || ($zid = 0);

my ($query, $pqf, $sTerm);
if ($self eq $template->param('url_itemstatus')) {
    $template->param(msgItemStatus => 1);
}
# advance search, item status is a link to standard search
my ($sfOrder, $kw, $boolop);
my @sInput;

# Cookie::sortAttr
my $sortAttr = $input->{'sortAttr'};
$sortAttr=undef if ($zid != 0);
$template->param(sortAttr => $sortAttr,);

# Cookie::sortOrder
my $sortOrder = $input->{'sortOrder'};
$template->param(sortOrder => $sortOrder,);

$pqf = '';
# get subject list by alphabet ($alp)
my $pageSize=50;
my $alp = $input->{'tl'};
my $pSubjNum = $input->{'pSubjNum'};
$pSubjNum= $pSubjNum?$pSubjNum:1;
my $offset=($pSubjNum-1)*$pageSize;
my $totalPageSubj =ceil(getSubjectCount($dbh,$alp)/$pageSize);
my $subjectList = getSubjectList($dbh,$alp,$offset,$pageSize);
$template->param(
    alp             => $alp,
    subjectList     => $subjectList,
    totalPageSubj   =>$totalPageSubj,
    pSubjNum        =>$pSubjNum,
    pSubjFirst          =>($pSubjNum==1?1:0),
    pSubjLast          =>($pSubjNum==$totalPageSubj?1:0),
);

my $iCount = 0;



foreach my $cgiInput (keys %$input) {
    $iCount++ if ($cgiInput =~ m/^sf/);
}
for (my $i = 0; $i < $iCount; $i++) {
    $sfOrder= 'sf' . $i;
    $kw     = 'kw' . $i;
    $boolop = 'boolop' . $i;
    # cleanup...
    #$input->{$kw} = fdgadfg
    push @sInput, {
        iOrder  => "$i",
        sOrder  => "$input->{$sfOrder}",
        sKw     => "$input->{$kw}",
        sBool   => $input->{$boolop},
    };

    if ($input->{$kw}) {
        $sTerm = srch_parseSearchTerm($input->{$kw});
        if ($sTerm) {
            if ($pqf) {
                $pqf = "\@$input->{$boolop} $pqf \@attr 1=$input->{$sfOrder} $sTerm";
            }
            else {
                $pqf = "\@attr 1=$input->{$sfOrder} $sTerm";
            }
        }
    }
}
$template->param(
    sInput => \@sInput,
);

if ($pqf) {
    # Scoping
    my $scopeSys = $cgi->cookie('scopeSysCode');
    my $scopeLib = $cgi->cookie('scopeLibCode');
    if ($scopeSys || $scopeLib) {
        if ($scopeSys && $scopeLib) {
            $pqf = "\@and $pqf \@and \@attr 1=5003 $scopeSys \@attr 1=5004 $scopeLib";
        }
        elsif ($scopeSys) {
            $pqf = "\@and $pqf \@attr 1=5003 $scopeSys";
        }
        else {
            $pqf = "\@and $pqf \@attr 1=5004 $scopeLib";
        }
    }
    
    # Sort
    if ($sortAttr && ($sortAttr == 4    ||  # Title
                      $sortAttr == 31   ||  # Date-publication
                      $sortAttr == 1003 ||  # Author-name
                      $sortAttr == 5001)) { # Call-number-local
        ($sortOrder && $sortOrder == 2) || ($sortOrder = 1);
        $pqf = "\@or $pqf \@attr 7=$sortOrder \@attr 1=$sortAttr 0";
    }
    
    my $pSize = 20;
    my $curPage = $input->{'pNum'};
    ($curPage && $curPage >= 1) || ($curPage = 1);
    my $offset = ($curPage - 1) * $pSize + $ENV{'Z_INDEX_BASE'};
     
#open ppp, ">/tmp/ppp";
#print ppp $pqf, "\n", $input->{'kw0'};
#close ppp;
    my ($resultSize, $result) = srch_searchRecord($dbh, $zid, 'b', $pqf, $offset, $pSize);
    my $i=0;
    if ($template->param('typeBranch') && $zid == 0) {
        foreach my $record (@$result) {
            my ($numTotal, $numLoan, $numReserve, $numHold, $items)
                = circ_infoRecord($dbh, $record->{'rid'}, $record->{'itemList'});
            $record->{'numTotal'} = $numTotal;
            $record->{'numLoan'} = $numLoan;
            $record->{'numReserve'} = $numReserve;
            $record->{'numHold'} = $numHold;
            $record->{'numReserveTotal'} = $numReserve + $numHold;
            $record->{'numAvailable'} = $numTotal - $numLoan - $numHold;
            $record->{'recNum'} =  $offset + $i++;
        }
    }

    if ($resultSize - $offset + 1 <= 0) {
        my $availRange = $resultSize % $pSize;
        $availRange = $pSize if ($availRange == 0); 
        $offset = $resultSize - $availRange + 1;
        $curPage = ($offset - 1) / $pSize + 1;
    }

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

    $template->param(
        bibliography        => (($zid == 0 && $#$result >= 0) ? 1:0),
        resultSize          => $resultSize,
        result              => $result,
        pNum                => $curPage,
        rec_start           => $offset,
        rec_end             => ($offset + $#$result),
        rangedPageList      => \@rangedPageList,
        sortCallNum1st      => ($sortAttr == 5001)              ? 1 : 0,
        sortTitle           => ($sortAttr == 4)                 ? 1 : 0,
        sortAuthor          => ($sortAttr == 1003)              ? 1 : 0,
        sortPubDateSort     => ($sortAttr == 31)                ? 1 : 0,
        sortOrderReverse    => ($sortOrder && $sortOrder == 1)  ? 2 : 1,
        sortDown            => ($sortOrder && $sortOrder == 1)  ? 1 : 0,
        sortable            => (1<$resultSize && $resultSize<=1000)              ? 1 : 0,
        stdSrch             => 1 ,
    );
}
else {
    if ($self eq $template->param('url_srchAdv')) {
        my @inputSearch = tmpl_searchFieldAdvance($dbh);
        $template->param(
            srchAdv => 1,
            inputSearch => \@inputSearch,
        );
    }
    elsif ($self eq $template->param('url_srchZimport')) {
    }
}

my @siteTab = srch_zTab($dbh, $zid);
$template->param(
    zid => $zid,
    kw0 => (($self eq $template->param('url_srchAdv')) ? '' : $input->{'kw0'}),
    pqf => $pqf,
    siteTab => \@siteTab,
);

$template->param(subjects=>1,);

tmpl_write($dbh, $cgi, \@cookieList, $template);

#////////////////////////////////////////////////////////////////////////////////////////////////////

sub getSubjectCount{
    my ($dbh,$term)=@_;
    my ($dbh,$term,$offset,$size)=@_;
    my $retval=0;
    my $sql = "select count(*) as count from opl_subjects where ";
    if (length($term) == 1) {
        $sql .= "subject like '$term%'  && recCount>0 ";
    }
    elsif (length($term) > 1) {
        if ($term =~ m/"([^\"]+)"/) {
            while ($term =~ s/"([^\"]+)"//) {
                $sql .= "subject like '%$1%' && ";
            }
        }
        
        $term =~ s/[\s]+/ /g;
        $term =~ s/(^ | $)//g;
        if ($term) {
            $term= " $term";
            $term =~ s/ / \+/g;
            $sql .= "match(subject) against('$term' in boolean mode) && ";
        }

        $sql .= "recCount > 0";
    }
    my $sth =$dbh->prepare($sql);
    $sth->execute();
    my $rec = $sth->fetchrow_hashref;
    if($rec) {
        $retval=$rec->{'count'};
    }
    return $retval;
        

}

#////////////////////////////////////////////////////////////////////////////////////////////////////
sub getSubjectList_bk{
    my ($dbh,$term,$offset,$size)=@_;
    my @retval;
    my $sql = 'select id,subject from opl_subjects where ';
    #$term =~ s/[\']+/''/g;

    if (length($term) == 1) {
        $term =~ s/[\']+/''/g;
        $sql .= "subject like '$term%'  && recCount>0 order by subject limit $offset,$size";
    }
    elsif (length($term) > 1) {
        if ($term =~ m/"([^\"]+)"/) {
            while ($term =~ s/"([^\"]+)"//) {
                my $tmp = $1;
                $tmp =~ s/[\']+/''/g;
                $tmp =~ s/(^ | $)//g;
                $sql .= "subject like '%$tmp%' && ";
            }
        }
        
        $term =~ s/[\s]+/ /g;
        $term =~ s/[\']+/''/g;
        $term =~ s/(^ | $)//g;
        if ($term) {
            $term= " $term";
            $term =~ s/ / \+/g;
            $sql .= "match(subject) against('$term' in boolean mode) && ";
        }

        $sql .= "recCount > 0 order by subject limit $offset, $size";
    }
    
    my $sth =$dbh->prepare($sql);
    $sth->execute();
    while (my $rec =$sth->fetchrow_hashref) {
	    $rec->{'subject'} =~ s/\'/\&#39/g;    
        push @retval,$rec;
    }
    $sth->finish;
    return \@retval;

    
}

#//////////////////////////////////////////////////////////////


sub getSubjectList{
    my ($dbh,$term,$offset,$size)=@_;
    my @retval;
    my $sql = 'select id,subject from opl_subjects where ';
    #$term =~ s/[\']+/''/g;

    if (length($term) == 1) {
        $term =~ s/[\']+/''/g;
        $sql .= "subject like '$term%'  && recCount>0 order by subject limit $offset,$size";
    }
    elsif (length($term) > 1) {
        if ($term =~ m/"([^\"]+)"/) {
            while ($term =~ s/"([^\"]+)"//) {
                my $tmp = $1;
                $tmp =~ s/[\']+/''/g;
                $tmp =~ s/(^ | $)//g;
                $sql .= "subject like '%$tmp%' && ";
            }
        }
        
        $term =~ s/[\s]+/ /g;
        $term =~ s/[\']+/''/g;
        $term =~ s/(^ | $)//g;

        if ($term) {
            $term= " $term";
            my @arrTerm = split(' ',$term);
            my $arg="" ;
            foreach my $t(@arrTerm){
                $arg .= " +(" . $t ." " .$t ."''s)";
            }
            $sql .= "match(subject) against('$arg' in boolean mode) && ";
        }

        $sql .= "recCount > 0 order by subject limit $offset, $size";
    }

    
    my $sth =$dbh->prepare($sql);
    $sth->execute();
    while (my $rec =$sth->fetchrow_hashref) {
	    $rec->{'subject'} =~ s/\'/\&#39/g;    
        push @retval,$rec;
    }
    $sth->finish;
    return \@retval;

    
}
