#!/usr/bin/perl

#use utf8;
use strict;
use CGI;
use Encode;

use Opals::Context;use POSIX qw(
    ceil
);

use Opals::Template qw(
    tmpl_read
    tmpl_write
    tmpl_preference
);
use Opals::Search qw(
    srch_templateMarcRecord
    srch_templateMarcList
    srch_getMarcImport
    srch_getIdenticalRIDs
);
use Opals::MarcXml qw(
    mxml_deleteTemplate
    mxml_templateMaxOrder
    mxml_isLock
);
use Opals::User qw(
    user_getInformationById
);
use Opals::Utility qw(
    util_getTimeout_min
);
use Opals::Locale qw(
    loc_getMsgFile
    loc_write
);

use Opals::Session qw(
    SessionHdl_clearVar
    SessionHdl_get
);
use Opals::Ebook qw(
    eb_getLicense
    eb_getBidByMarcXmlRid
);

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

my $cgi = CGI->new;
my $input = $cgi->Vars();

my $zdbDir = Opals::Context->config('zRoot') .'/'
           . Opals::Context->config('zPort') .'/'
           . 'record' .'/'
           . Opals::Context->config('zDatabase');




my ($permission, $cookie, $template) = tmpl_read(
        {
            dbh             => $dbh,
            cgi             => $cgi,
            tmplFile        => 'marc21/edit.tmpl',
            reqPermission   => 'marc_edit|marc_add',
        }
);
my $debug     = $input->{'debug'};
my $rid       = $input->{'rid'};       #edit record ID 
   ($rid && $rid =~ m/^[\d]+$/ && $rid >= 0) || ($rid = 0);
my $nextRid;   
my $resultId    = $input->{'resultId'};  #import recordID
my $tmplMarcId  = $input->{'tmplMarcId'};#edit   template ID
### Thu, Mar 14, 2013 @ 10:03:14 EDT
# EBOOK
my $ebookId=$input->{'bid'};
if (!defined $ebookId){
  $ebookId = eb_getBidByMarcXmlRid($dbh,$rid);
  
}
    my $ebLicense = eb_getLicense($dbh,$ebookId) if ($ebookId);
    if(defined $ebLicense){
        $template->param(
            ebLicenseType  => $ebLicense->{'licenseType'},
            ebTotalLicense => $ebLicense->{'totalLicense'}
        );
        $template->param(itemFree  => 1) if($ebLicense->{'licenseType'} eq 'free');
    }

#
#

my $isClone     = $input->{'clone'};
my $syspref     = tmpl_preference($dbh);
my $loginuid    = $template->param('curUserId');
my $autoAdd2NewItemList = $syspref->{'autoAdd2NewItemList'};
   $autoAdd2NewItemList = 0 if ($autoAdd2NewItemList !~ m/^0$|^1$/);
my ($isLock,$last_sessionid,$lockTime);
my $timeout     = $syspref->{'timeout'};
my $timeout_min =  util_getTimeout_min($timeout); # should be from $syspref
my $sessionid   = $cgi->cookie('sessionID');


##### Notes:  dont't forget lock/unlock record when edit
my $op      = $input->{'op'};
my $archId  = $input->{'archId'};


# GET LIST OF LOCATIONS
   my $locationList = getLocationList($dbh,$input->{'location'});
   $template->param(  locList=>$locationList);
# GET LIST OF ITEM TYPE FROM opl_itemType TABLE
    my $itemTypeList = getItemTypeList($dbh);
    $template->param(itemTypeList =>  $itemTypeList);
# GET LIST OF PREFIX 852 k
    my $prefixList =  getPrefixList($dbh);
    $template->param(prefixList =>  $prefixList);

# GET LIST AWARD NOTE 586$A
    my $awardList =  getAwardList($dbh);
    $template->param( awardList=>  $awardList);



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

my @dupRid=();
if($rid>0){
    if($op ne 'hitlist'){
        $op= ($op eq 'clone' || $isClone)?"clone":"editRec";
    }
}
elsif(defined $resultId && $resultId >=0){
    $op="import";

}
    

#if ($permission && $permission->{'marc_edit'}) {
if ($permission && ($permission->{'marc_edit'} || $permission->{'marc_add'})) {
    my $editMode="";
    if($op =~ m/import|clone|import|tmplNewRec/){
        $template->param(add2NewItemList =>$autoAdd2NewItemList);
    }
    if($op eq "import"){
        $editMode='zImport';
        @dupRid=getDupRecordByResultId($dbh,$resultId,$loginuid);
        $template->param(id              => $resultId,
                         add2NewItemList =>$autoAdd2NewItemList,
                         ebookId=>$ebookId);
    }
    elsif($op eq 'tmplDelete' && $tmplMarcId){
            $editMode = "";
            my $tmplName = mxml_deleteTemplate($dbh, $tmplMarcId);
            $template->param(
                listTemplate    => srch_templateMarcList($dbh),
                tmplMarcDelete  => 1,
                tmplName        => $tmplName,
            );
        }
    elsif($op eq 'tmplEdit'){ 
            $editMode = "editTmpl";
            my $tmplMarcRec      = srch_templateMarcRecord($dbh,$tmplMarcId);
            my $maxTemplateOrder = mxml_templateMaxOrder($dbh) +1;
            $template->param(maxOrder  => $maxTemplateOrder,
                             tmplRank  => $tmplMarcRec->{'rank'},
                             tmplName  => $tmplMarcRec->{'name'},
                             id         => $tmplMarcId
            );
    }
    elsif($op eq 'tmplNewRec') {
           my ($sysDefinedType)=$dbh->selectrow_array("select sysDefinedType from opl_template where tid=?",undef,$tmplMarcId);
           $editMode = "newFromTmpl";
           $template->param(id  => $tmplMarcId,
                            sysDefinedType=>$sysDefinedType,
                            type => $editMode);
            
    }
    elsif($op eq 'clone' ){
           $editMode='clone';
           @dupRid=getDupReccordByrid($dbh,$rid);
           $template->param(id => $rid);

    }
    elsif($op eq 'importFromFile' ){
           $editMode='importFromFile';
           my $filePath=$input->{'filePath'};
           $template->param(filePath => $filePath,
                            id =>0,ebookId=>$ebookId);

    }
    
    elsif($op eq 'restoreFromArch' ||  $op eq 'editRec' || $op eq 'hitlist'){
        if($op eq 'hitlist'){
            $editMode="hitlist";
            my $sessionID = $cgi->cookie('globalSessionID');
            if (!$rid){
                $rid=getNextRid2Edit($dbh, $sessionID);
            }
            $nextRid=getNextRid2Edit($dbh, $sessionID,$rid);
           # my $hitlistEditor = getHitlist($dbh,$sessionID,$rid);
            #$template->param(hitlistEditor => $hitlistEditor);
           if($rid || $nextRid){
            $template->param(id              => $rid,
                             nextRid         => $nextRid,
                             hitlist         => 1,
                             ssid            => $sessionID);
           }
           else{
               $template->param(hitlistEmpty=>1);
           }
        }

        ($isLock,$last_sessionid,$lockTime) =
                mxml_isLock($dbh, $rid, $loginuid);
    
        if($isLock eq 'true'){
            my $editor_id = editor($dbh, $rid);
            my ($userInfo, $guardian) = user_getInformationById($dbh,$editor_id); 
            if ($editor_id eq $loginuid){
                 $template->param(sameper => 1 ,);
            }
            $template->param(
                recLock  => 1,
                who     => $userInfo->{'firstname'}. ' ' .$userInfo->{'lastname'},
                where   =>'MARC Editor',       
            );
        }
        else{ 
            #if($isLock ne 'true')
            if($op eq 'restoreFromArch' && $archId>0){
                 $editMode = "restoreFromArch";
                 my $rOpt  = $input->{'rOpt'};
                 $template->param(rOpt    => $rOpt,
                                  id  => $archId,);
            }                
            elsif($op eq 'editRec' ){
                $editMode='editRec';          
                @dupRid=getDupReccordByrid($dbh,$rid);
                if(scalar(@dupRid)==1){
                    @dupRid=();
                }
                $template->param(id      => $rid,
                                 ebookId => $ebookId);
            }
            # set lock for the record in table  opl_marcRecord
                if ($last_sessionid
                 && $last_sessionid ne $sessionid
                 && $lockTime eq 'true') {
                    # check case same uid but different sessionid
                    # and record is lock or not 
                    $template->param(
                        diffSession  => 1,
                    );
                }
                else {
                    setRecordLock(
                        $dbh, $loginuid, $rid, $timeout_min, $sessionid
                    );
                }
        }#elsif($isLock ne 'true')
    }#elsif($op eq 'restoreFromArch' || $op eq 'clone' || $op eq 'editRec' ) 
    else {
        #CASE SHOW LIST OF THE TEMPLATE
        if ($ENV{'REQUEST_URI'} !~ m/\?/) {
            $template->param(
                listTemplate => srch_templateMarcList($dbh),
            );
        }
        else {
            $template->param(
                invalidRequestMethod => 1,
            );
        }
        $template->param(selTemplate2Edit=>1);
   }

          
       $template->param(loginuid    => $loginuid,
                        type        => $editMode,
                        dupRid      =>\@dupRid,
                        debug       =>($debug eq '1')?'true':'false',
                         );
}  

    my $msgValMap={
                    marc21Edit_msg03=>{rid     =>$template->param('rid')}
                    };
        
  my $marc21EditMsgMap =loc_getMsgFile('marc21/edit.msg',$msgValMap);
  loc_write($template,$marc21EditMsgMap);
  my $marc21EditMsgMap2 =loc_getMsgFile('record/marcEditor.msg',$msgValMap);
  loc_write($template,$marc21EditMsgMap2);
  my $marc21EditMsgMap3 =loc_getMsgFile('ebook.msg',$msgValMap);
  loc_write($template,$marc21EditMsgMap3);
   $template->param( hlpUrl      => Opals::Constant->getHlpUrl('marc_edit'));

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

#--------------------------------------------------------------------------
sub getHitlist{
    my($dbh,$ssid,$rid,$size)=@_;

    
    my @hitlist= ();
    my $sql = "select  m.rid,m.title,m.author,m.pubDate,i.data isbn ,if(s.note='saved','true',false) saved
                from   opl_marcRecord m inner join opl_sessionVar s using(rid) 
                        left outer join opl_recordIdentifier i on i.rid=s.rid && i.tag ='020' && i.code='a' 
                where s.var='marcEditHitlist'  && s.ssid = ? && 
                      s.sOrder>=(select sOrder from opl_sessionVar where var ='marcEditHitlist'  && s.ssid = ? && rid=?) 
                group by  s.rid 
                order by s.sOrder";
    my $sth=$dbh->prepare($sql);
    $sth->execute($ssid,$ssid,$rid);

   
    while (my $rec = $sth->fetchrow_hashref){
        $rec->{'curEdit'}= 1 if($rec->{'rid'} == $rid);
        push @hitlist, $rec;
    }
    $sth->finish;
 
    return \@hitlist;
}
#--------------------------------------------------------------------------
sub getNextRid2Edit{
    my($dbh,$ssid,$rid)=@_;
    my $nextRid;
    my @params=($ssid);
    my $sql = "select rid from opl_sessionVar where var ='marcEditHitlist' && ssid= ? && (note is null || note ='')";
    if($rid){
        $sql .= " && sOrder >(select sOrder from opl_sessionVar where var ='marcEditHitlist' &&  ssid= ? && rid=? ) ";
        @params=($ssid ,$ssid,$rid );
    }
    $sql .= "  order by sOrder asc limit 1";



    my $sth=$dbh->prepare($sql);
    $sth->execute(@params);
    ($nextRid) = $sth->fetchrow_array;
    $sth->finish;
    return $nextRid;

}

#--------------------------------------------------------------------------
sub setRecordLock {
    my ($dbh, $loginuid, $rid, $timeout_min, $sessionID) = @_;
    my $sql_rec = $dbh->prepare(<<_SQL_);
update  opl_marcRecord
set     sessionid = ?,
        lockExpire = now() + interval ? MINUTE,
        editUid = ?
where   rid = ?
_SQL_

    $sql_rec->execute($sessionID, $timeout_min, $loginuid, $rid) || return;
    $sql_rec->finish;
}

#----------------------------------------------------------------------------------------
sub getDupReccordByrid{
    my($dbh,$rid)=@_;
    my $xml=getMarcXmlRecord($rid);
     my @dupRid= getRecDuplicate($dbh, $xml);
     if(scalar(@dupRid)==1 && @dupRid[0] == $rid){
         @dupRid=();
     }
     return @dupRid;

}
#----------------------------------------------------------------------------------------
sub getDupRecordByResultId{
    my($dbh,$resultId,$uid)=@_;
    my $xml=srch_getMarcImport($dbh,$uid,$resultId);
    return getRecDuplicate($dbh, $xml);
}
#----------------------------------------------------------------------------------------
sub getRecDuplicate {
    my ($dbh, $xml) = @_;

    my @recDuplicate=();
    my $tmpRidTbl={};
    $xml =~ s/' \+\n'/\n/g;

    my $marc = Opals::Marc::Record::newFromXml($xml);
    my $ridGroups = srch_getIdenticalRIDs($dbh, $marc);

    my $ridList;
    foreach my $id (@Opals::Search::RECORD_IDENTIFIERS) {
        my $sf = $id->{'tag'} . $id->{'code'};

        foreach my $row (@{$ridGroups->{$sf}}) {
            $tmpRidTbl->{$row->{'rid'}}=1;
        }
    }
    foreach my $k (sort keys %$tmpRidTbl){
        push @recDuplicate,{recId=>$k};
    }
    #@recDuplicate= sort {$a->{'recId'} <=> $b->{'recId'}} @recDuplicate;
 
    return @recDuplicate;
}

#------------------------------------------------------------------------------
sub getMarcXmlRecord{
    my($rid) =@_;
    my $dir = ceil($rid/1000);
    my $path="$zdbDir/$dir/$rid.xml";
    my $xml="";
    if(-f $path){
        open MARCXML, "<$path";
        my $line="";
        while (<MARCXML>) {
            $line = $_;
            if ($line =~ m/<subfield code="-">/) {
                next;
            }
            $xml .=$line;
        }
        close MARCXML;
    }
    return $xml;


}
##############################################################################
sub editor {
    my ($dbh, $rid) = @_;
    my $retval = '';
    my $sql_MARCrec = $dbh->prepare(<<_SQL_);
select  editUid,sessionid, time_to_sec(timediff(lockExpire, now())) as deltaLockTime
from    opl_marcRecord
where   rid = ?
_SQL_
    $sql_MARCrec->execute($rid);
    my $sf = $sql_MARCrec->fetchrow_hashref;
    if ($sf->{'deltaLockTime'} > 0) {
        $retval = $sf->{'editUid'};
    }
    $sql_MARCrec->finish;
    return $retval; 
}
################################################################################     
sub getItemTypeList{
    my ($dbh)= @_;
    my $sql = <<_SQL_;
SELECT     distinct id 
FROM       opl_itemType
WHERE      id <>""
ORDER BY    id
_SQL_

    my $sth = $dbh->prepare($sql);
    $sth->execute();
    my @retVal;
    my $itentypeStr=""; 
    while (my $id = $sth->fetchrow_hashref) {
          push @retVal, $id;
    }
    $sth->finish;
           
    return \@retVal;
}

##############################################################################
sub getEbookId_bk{
    my ($dbh,$rid)= @_;
    my $sth = $dbh->prepare(<<_SQL_);
    select bid from opl_ridBid where rid=?
_SQL_
   
    $sth->execute($rid);
    my ($bid) = $sth->fetchrow_array;
    $sth->finish;
    return $bid eq '0E0'? 0:$bid;
}
################################################################################     
sub getPrefixList{
    my ($dbh)= @_;
    my $sql = <<_SQL_;
select distinct trim(sfData) sf852Data from opl_authCtrl where tag='852' && sfCode='k' order by sfData
_SQL_

    my $sth = $dbh->prepare($sql);
    $sth->execute();
    my @retVal;
    while (my $loc = $sth->fetchrow_hashref) {
        push @retVal, $loc;
    }
    $sth->finish;
           
    return \@retVal;
}

#=======================================================
sub getLocationList{
    my($dbh,$curSrchLoc)=@_;
    my $locList=[];
    my $sth=$dbh->prepare("select distinct trim(sfData) from opl_authCtrl where tag='852' &&  sfCode='c' order by sfData");
    $sth->execute();
    while(my  ($location) =$sth->fetchrow_array){
        my $selected=($curSrchLoc eq $location);
        push @$locList,{location=>$location,selected=>$selected};
    }
    return $locList;
}
################################################################################     
sub getAwardList{
    my ($dbh)= @_;
    my $sql = <<_SQL_;
select distinct trim(sfData) sf586a from opl_authCtrl where  tag='586' && sfCode='a' order by sfData
_SQL_

    my $sth = $dbh->prepare($sql);
    $sth->execute();
    my @retVal;
    while (my $loc = $sth->fetchrow_hashref) {
        push @retVal, $loc;
    }
    $sth->finish;
           
    return \@retVal;
}

