#!/usr/bin/perl

#use utf8;
use strict;
use CGI;

use Opals::Context;
use JSON;
use Opals::Circulation qw(
  circ_getRecInfo
  circ_numItemsAvailable
);
use Opals::BookCover qw(
  bookCover_google
  bookCover_syndetics

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

use Opals::Rating qw(
    cmntRating_getTeacherList
    cmntRating_getComntList
    cmntRating_getAllComntsByRid
    cmntRating_getList2Review
    cmntRating_update
    cmntRating_countComntList
    cmntRating_deleteByRecId
    cmntRating_delete
    cmntRating_getInfoByRid
    cmntRating_getComntsByRid

);
my $dbh = Opals::Context->dbh();
END { $dbh->disconnect(); }
my $req=getRequest();
my $cgi      = CGI->new;

my ($errCode, $ck, $resp) = Opals::User::user_currentUser($dbh, $cgi);
my  $respUid =$resp->{'uid'};


my $fnMap={
    getList =>\&_getCmtRatingList,
    delList =>\&_delCmtRatingList,
    delCmt  =>\&_delCmtRating,
    update  =>\&_saveCmt,
    evaluate=>\&_evaluateCmt,
    cmtList=>\&_getCmtList
};
my $rs={};
if(defined $fnMap->{$req->{'op'}}){
    my $fn=  $fnMap->{$req->{'op'}};
    $rs =&$fn($dbh,$req);
}


print "Content-type: text/plain\n\n";

print to_json($rs,{pretty=>1});
#=================================================
sub _saveCmt{
    my($dbh,$req)=@_;

    my $reviewInfo={
         saveCode   => '1',
         id         => $req->{'data'}->{'id'},
         firstname  => $req->{'data'}->{'data'}->{'firstname'} ||"",
         lastname   => $req->{'data'}->{'lastname'}||"",
         t_firstname=> $req->{'data'}->{'t_firstname'},
         t_lastname => $req->{'data'}->{'t_lastname'},
         rid        => $req->{'data'}->{'rid'},
         rating     => $req->{'data'}->{'rate'},
         comment    => $req->{'data'}->{'comment'}         
    };
    cmntRating_update($dbh,$reviewInfo);
    return {reviewInfo=>$reviewInfo};
}
#=================================================
sub _getCmtList{
    my($dbh,$req)=@_;
    my $rs={};
    my $rid=$req->{'rid'};
    my $filter=$req->{'filter'};
    my $recInfo =getRecInfo($dbh,$rid);
    my $pageNum     = $req->{'pNum'};
    my $pSize       = $req->{'pSize'};
    ($pageNum  && $pageNum >=1)||($pageNum=1); 
    ($pSize && $pSize >=1)||($pSize=10);
    my $offset= ($pageNum -1) * $pSize ;


    if($recInfo->{'rid'} >0){
        $rs->{"ratingInfo"} =cmntRating_getInfoByRid($dbh,$rid);
        $rs->{"commentList"}= cmntRating_getComntsByRid($dbh,$rid,$filter,$offset,$pSize);
        $rs->{"bibInfo"}=$recInfo;

    }

    return $rs;


}
#=================================================
sub _evaluateCmt{
    my($dbh,$req)=@_;
    my $reviewInfo={};

    foreach my $c(@{$req->{'cmdList'}}){
        $reviewInfo={};
        if(defined $c->{'accepted'} && $c->{'accepted'} ne ''){
            $reviewInfo->{'accepted'}   =$c->{'accepted'};
            $reviewInfo->{'id'}         =$c->{'cid'};
            $reviewInfo->{'reviewed'}   =1;
            $reviewInfo->{'reviewerUid'}=$respUid;
            cmntRating_update($dbh,$reviewInfo);
        }
    }

    return {reviewInfo=>$reviewInfo};
}

#=================================================
sub _getCmtRatingList{
    my($dbh,$req)=@_;
    my $pageNum     = $req->{'data'}->{'pNum'};
    my $pSize       = $req->{'data'}->{'pSize'};
    my $sortField   = $req->{'data'}->{'sort'};
    my $sortDir     = $req->{'data'}->{'sortDir'};
    my $t_firstname = $req->{'data'}->{'t_firstname'};
    my $t_lastname  = $req->{'data'}->{'t_lastname'};

    if (!$sortDir) {
        $sortDir='asc';
    }
    if (!$sortField) {
        $sortField ='lastCommentOn ';
        $sortDir   = 'desc';
    }
    ($pageNum  && $pageNum >=1)||($pageNum=1); 
    ($pSize && $pSize >=1)||($pSize=10);
    my $offset= ($pageNum -1) * $pSize ;
    my $comntLst=[];
    my $count  = cmntRating_countComntList($dbh,$t_firstname,$t_lastname);
    if($count>0){
        $comntLst = cmntRating_getComntList($dbh,$offset,$pSize,$sortField,$sortDir,$t_firstname,$t_lastname);
    }
    return {count=>$count,rsList=>$comntLst};

}
#=================================================
sub _delCmtRatingList{
    my($dbh,$req)=@_;
    my $ridList     = $req->{'ridList'};
    foreach my $rid(@$ridList){
        cmntRating_deleteByRecId($dbh,$rid);
    }
    return {delRidList=>$req->{'ridList'}};

}
#=================================================
sub _delCmtRating{
    my($dbh,$req)=@_;
    my $id     = $req->{'id'};
    cmntRating_delete($dbh,$id);
    return {id=>$id};

}

#=================================================
sub getRequest{
  my $fineList=[];
  my $in={};
  if ($ENV{'REQUEST_METHOD'} eq "POST") {
        my $json ="";
        while (<STDIN>) {
            $json .= $_;
        }
        #open debug ,">/tmp/bb";print debug $json;close debug;
        $in = decode_json($json);
   }
   return $in;
}
#------------------------------------------------------------------------------
sub recordPath {
    my ($rid) = @_;
    
    my $zRoot   = Opals::Context->config('zRoot');
    my $zPort   = Opals::Context->config('zPort');
    my $zDatabase = Opals::Context->config('zDatabase');
    my $dir     = "$zRoot/$zPort/record/$zDatabase/" . ceil($rid/1000);

    return $dir;
}
#=======================================================
sub getBookCover {
  my ($recList)    = @_;
  my $awsSecretKey = Opals::Context->preference('amazonSecreteKey');
  my $syndeticsId  = Opals::Context->preference('syndeticsId');
  if ($syndeticsId ne '') {
    bookCover_syndetics($recList);
  }
  else {
    bookCover_google($recList, "m");
  }

}
#=======================================================
sub  getRecInfo{
  my ($dbh,$rid)= @_;

  my $marcXmlParser=Opals::MarcXmlParser->new();
   my $fname=recordPath($rid)."/$rid.xml";

   my $rec=$marcXmlParser->getRecInfoGeneral_file($fname);
   if($rec){
       getBookCover([$rec]);
   }
  return $rec;
}

#
