#!/usr/bin/perl

#use utf8;
use strict;
use CGI;

use Time::localtime;
use Opals::Context;

use Opals::User qw(
    user_getInformationById
);
use Opals::Template qw(
    tmpl_preference
);

use Opals::Circulation qw(
    circ_getItemStatus
    circ_getItemInfo
    circ_cancelHoldByRid
    circ_lostDeclarating
    circ_claimReturned
    circ_claimNeverLoan
    circ_record_ODL
    circ_cancelReserveByRid
    circ_cancelHoldByRid
);
use JSON;

use Opals::Constant;

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

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

my $dateDue;
my $tm = localtime;
my $todayStr = sprintf("%04d-%02d-%02d", $tm->year+1900, ($tm->mon)+1, $tm->mday);
my $syspref = tmpl_preference($dbh);

    my @itemRSList=();
    my @bcArr = split /,/,$input->{'bcList'};
    my $claim=$input->{'claim'};
    foreach my $barcode(@bcArr){
        $barcode    =~ s/^\s+|\s+$//g;

        my $lost_odl_id=0;
        my $lostMsgCode="";
        #    "01" :ok
        #    "02" : item does not exist
        #    "03" : item already marked as lost
        my $itemCircStatus = circ_getItemStatus($dbh,$barcode );
        my $uid =$itemCircStatus->{'l_uid'};
        my $itemInfo = circ_getItemInfo($dbh,$barcode, $uid);
        # check if item exists
        if($itemCircStatus->{'status'} == IT_STAT_NOEXIST){
            $lostMsgCode="02";
        }

        # check if item is already marked as lost
        elsif($itemCircStatus->{'status'} == IT_STAT_LOST
             || $itemCircStatus->{'status'} == IT_STAT_CLAIM_RETURN
             || $itemCircStatus->{'status'} == IT_STAT_CLAIM_NEVER_LOAN){
            $lostMsgCode="03";
        }
        else{
            # record lost if item is currently on loan
            my($lid)=$dbh->selectrow_array("select idloan from opl_loan where barcode=? && dateReturn is null",undef,$barcode);
            if($lid && $lid>0){
            #if($itemCircStatus->{'status'} == IT_STAT_ONLOAN){
                $lost_odl_id = circ_record_ODL($dbh,$itemCircStatus->{'l_idloan'},$claim,0);
            }
            # cancel hold or reserve if any...
            if($itemCircStatus->{'status'} == IT_STAT_ONHOLD){
                circ_cancelHoldByRid($dbh,$itemInfo->{'rid'});
            }
            if($itemCircStatus->{'status'} == IT_STAT_HAVE_RSVR){
                circ_cancelReserveByRid($dbh,$itemInfo->{'rid'});
            }
            if($claim eq 'claimNeverLoaned'){
                circ_claimNeverLoan($dbh,$barcode);

            }
            elsif($claim eq 'claimReturned'){
                circ_claimReturned($dbh,$barcode);
            }
            
            else{
                circ_lostDeclarating($dbh,$barcode);
            }
            $lostMsgCode="01";
        }
        
        

        push @itemRSList,{
                            uid        =>$itemCircStatus->{'l_uid'},
                            lid        =>$itemCircStatus->{'l_idloan'},
                            lostMsgCode  =>$lostMsgCode,
                            lost_odl_id  =>$lost_odl_id,
                            bibInfo=>{
                                rid        => $itemInfo->{'rid'},
                                barcode    => $barcode,
                                title      => $itemInfo->{'title'},
                                author     => $itemInfo->{'author'},
                                pubName    => $itemInfo->{'pubName'},
                                pubDate    => $itemInfo->{'pubDate'},
                                callNumber => $itemInfo->{'callNumber'},
                                price      => $itemInfo->{'price'}
                            }
                        };



     }
     my $rs={claimType=>$claim,itemList=>\@itemRSList};
     print "Content-type: text/plain\n\n";
     print   to_json($rs);
    


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