#!/usr/bin/perl

#use utf8;
use strict;
use CGI;

use Opals::Context;use POSIX qw(
    floor
);
use Digest::SHA qw(
    sha512_base64
);

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

use Opals::Template qw(
    tmpl_read
    tmpl_write
    tmpl_preference
);
use Opals::Locale qw(
    loc_getMsgFile
    loc_write
);
use Opals::RecordInfoHTML qw(
    rinfo_getPageNavForm_search
);
use Opals::SolrIndex qw(
    slr_search
    slr_buildSearchQuery
);
my $dbh = Opals::Context->dbh();
END { $dbh->disconnect(); }

my $aSubfieldMap={itemType=>'3',location=>'c',prefix=>'k'};

my $cgi = CGI->new;
my $input = $cgi->Vars();
my ($permission, $cookie, $template) = tmpl_read(
        {
            dbh             => $dbh,
            cgi             => $cgi,
            tmplFile        => 'util/authorityCtrlMgr.tmpl',
            reqPermission   => 'rpt_catRec',
        }
);
    
$template->param(hlpUrl     => Opals::Constant->getHlpUrl(''));
my $authCtrlName=$input->{'authCtrlName'};
if($authCtrlName eq '' || !defined $authCtrlName){
    $authCtrlName= $cgi->cookie('authCtrlName');
}
push @$cookie, $cgi->cookie(-name => 'authCtrlName', -value => $authCtrlName,);

if($aSubfieldMap->{$authCtrlName}){
    my($tag,$sfCode)=('852',$aSubfieldMap->{$authCtrlName});
    my $changes =getAuthCtrlChanges();
    if(defined $changes && scalar @$changes>0){
        updateAuthCtrlTbl($dbh,$authCtrlName,$changes);
    }
    my $geChanges=getGolbalChanges();
    if($geChanges  && scalar @$geChanges>0){   
        applyChange2MarcRec($dbh,$authCtrlName,$geChanges);
    }
    my $authList      =getAuthoriryCtrlList($dbh,$tag,$sfCode);
    my $sf852DataStat =getSf852DataStats($dbh,$sfCode);
    $template->param(authCtrlList =>$authList,
                     numAuthList  =>scalar(@$authList),
                     sf852DataStat=>$sf852DataStat);
}

my $msgValMap ={};
   $msgValMap ={specificAuthCtrlListNameTxt=>{aName=>ucfirst($authCtrlName)},
                addNewTxt=>{aName=>$authCtrlName},
                selNewTxt=>{aName=>$authCtrlName},
                curTxt   =>{aName=>ucfirst($authCtrlName)},
                statsTxt =>{aName=>ucfirst($authCtrlName)},
                globalChangeTxt=>{aName=>ucfirst($authCtrlName)},
                authCtrlNameTxt=>{aName=>ucfirst($authCtrlName)}
               };

my $msgMap            =loc_getMsgFile('util/authoriry.msg',$msgValMap);
loc_write($template,$msgMap);
#my $authCtrlListName=$msgMap->{$authCtrlName . "_authCtrlListNameTxt"};
#my $authCtrlNameTxt =$msgMap->{$authCtrlName ."Txt"};
$template->param(authCtrlName=>$authCtrlName
                );

tmpl_write($dbh, $cgi, $cookie, $template);
#=======================================================
sub getAuthoriryCtrlList{
    my($dbh,$tag,$sfCode)=@_;

    my $authList = [];
    my $i=0;
    my $sth=$dbh->prepare("select sfData valStr 
                           from opl_authCtrl where tag=? &&  sfCode=?");
     $sth->execute($tag,$sfCode);
    while(my $rec=$sth->fetchrow_hashref){
        $rec->{'index'}=$i++;
        $rec->{'valStr'} =_escapeXml($rec->{'valStr'});
        push @$authList,$rec;
    }
    return $authList;
}

#=======================================================
sub _escapeXml {
    my ($str) = @_;

    return unless $str;
    
    $str =~ s/&/&amp;/g;
    $str =~ s/"/&quot;/g;
    $str =~ s/'/&apos;/g;
    $str =~ s/</&lt;/g;
    $str =~ s/>/&gt;/g;
    return $str;
}

#=======================================================
sub getSf852DataStats{
    my($dbh,$sfCode)=@_;
    my $sf852DataStat = [];
    my $i=0;
    my $sth=$dbh->prepare("select sf852Data valStr,count(sf852Data) totalHolding,if(a.sfData is null,0,1) as inAuthList
                           from opl_itemInfo i left outer join opl_authCtrl a on a.sfCode=i.sf852Code && a.sfData=i.sf852Data 
                           where sf852Code=? && barcode not regexp '^___' group by sf852Data ");
     $sth->execute($sfCode);
    while(my $rec=$sth->fetchrow_hashref){
        my $ge=getGE_processing($dbh,$sfCode,$rec->{'valStr'});
        if($ge && $ge->{'req_id'}>0){
            $rec->{'req_id'} = $ge->{'req_id'};
            $rec->{'oldVal'} = $ge->{'oldVal'};
            $rec->{'newVal'} = $ge->{'newVal'};
        }
        $rec->{'index'}=$i++;
        push @$sf852DataStat,$rec;
    }
    return $sf852DataStat;
}
#=======================================================

sub getAuthCtrlChanges{
    my $i=0;
    my $changes=[];

    while(defined $input->{"authorCtrlVal_" . $i}){
        if($input->{"authorCtrlVal_". $i} ne $input->{"old_authorCtrlVal_". $i}){
            push @$changes,{oldVal=>$input->{"old_authorCtrlVal_". $i},
                            newVal=>$input->{"authorCtrlVal_". $i}};
        }
        $i++;
    }
    my @newVal=$cgi->param("authorCtrlVal_new");
    foreach my $val(@newVal){
         push @$changes,{newVal=>$val};
    }
    return $changes;
}
#=======================================================
sub getGolbalChanges{
    my $i=0;
    my $changes=[];
    while(defined $input->{"geSf852_src_" . $i}){
        if($input->{"geSf852_src_". $i} ne $input->{"geSf852_tar_". $i}){
            push @$changes,{oldVal=>$input->{"geSf852_src_". $i},
                            newVal=>$input->{"geSf852_tar_". $i}};
        }
        $i++;
    }
    return $changes;
}

#=======================================================

sub updateAuthCtrlTbl{
    my($db,$authCtrlName,$changes)=@_;
    my($tag,$sfCode)=('852',$aSubfieldMap->{$authCtrlName});
    my $sth_update=$dbh->prepare("update opl_authCtrl set sfData=? where sfData=? && tag=? && sfCode=?");
    my $sth_insert=$dbh->prepare("insert into opl_authCtrl set sfData=? ,tag=? ,sfCode=?");
    my $sth_del=$dbh->prepare("delete from opl_authCtrl where tag=? && sfCode=? && sfData=?");
    foreach my $c(@$changes){
        if($c->{'newVal'} eq '' ){
            $sth_del->execute($tag,$sfCode,$c->{'oldVal'});
        }
        elsif($c->{'oldVal'} ne '' ){

           $sth_update->execute($c->{'newVal'},$c->{'oldVal'},$tag,$sfCode);
        }
        else{
            $sth_insert->execute($c->{'newVal'},$tag,$sfCode);
        }
    }
    $sth_insert->finish;
    $sth_update->finish;
}
#=======================================================

sub applyChange2MarcRec{
    my($dbh,$authCtrlName,$changes)=@_;
    my($tag,$sfCode)=('852',$aSubfieldMap->{$authCtrlName});
    my $newReqid;
    my $loginuid = $template->param('curUserId');
    my $digest   = sha512_base64(time . rand(time));
    my $sth_req  =$dbh->prepare("insert  into opl_ge852request set digest =?,uid=?, tag=?,o_code=?, o_data=?, n_data=?, reqDate=now(), action=?,status=?");
    my $sth_id   = $dbh->prepare("select req_id from opl_ge852request where digest=? order by req_id desc limit 1");
    my $sth_count= $dbh->prepare("select count(*) from opl_itemInfo where barcode not regexp '___' && sf852Code=? && sf852Data=?");

    foreach my $c(@$changes){
        $sth_count->execute($sfCode,$c->{'oldVal'});
        my ($count) = $sth_count->fetchrow_array;
        $sth_count->finish;
        if($count >0 ){
            $sth_req->execute($digest,$loginuid,$tag,$sfCode,$c->{'oldVal'},$c->{'newVal'},'update','waiting');
            $sth_id->execute($digest);
            ($newReqid) = $sth_id->fetchrow_array;
            my $sth_rec=$dbh->prepare("insert  into opl_ge852record(req_id,rid,barcode) select $newReqid,i.rid,i.barcode 
                               from opl_item i inner join opl_itemInfo f using(barcode) 
                               where  barcode not regexp '___' && f.sf852Code=? && f.sf852Data=?");

            $sth_rec->execute($sfCode,$c->{'oldVal'});
       }
    }

    $sth_req->finish;
    $sth_id->finish;
   
}
#=======================================================
sub getGE_processing{
    my($dbh,$sfCode,$data)=@_;
    
    my $sth   = $dbh->prepare("select req_id ,o_data oldVal , n_data newVal from opl_ge852request where status <>'done' && action='update' && tag='852' && o_code =?  && o_data=?");
    $sth->execute($sfCode,$data);
    my $ret = $sth->fetchrow_hashref;
    return $ret;
}
