#!/usr/bin/perl

# export bibliography to RDF format
# Mainly for Zotero.

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

use Opals::Context;
#use Mail::Sendmail;
use Opals::Template qw(
    tmpl_read
    tmpl_write
);

use Opals::Context;
use Opals::Template qw(
    tmpl_read
    tmpl_write
    tmpl_preference

);

use URI::URL;

use Opals::Mail qw(
    mail_send
);
use Opals::Session qw(
    SessionHdl_get
);
use Opals::MarcXmlParser; 
my $dbh = Opals::Context->dbh();
use Opals::Locale qw(
    loc_getMsgFile
    loc_write
);
use JSON;

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

my $cgi = CGI->new;
my $input = $cgi->Vars();
my $bibJsonStr= $input->{'bibJson'};
my $bibObj=from_json($bibJsonStr);
my $sessionID = $cgi->cookie('globalSessionID');
my $pref    = tmpl_preference($dbh);


   my $bib = getBib($bibObj);
   
   print "Content-Type:application/x-download\n";
   print "Content-Disposition:attachment;filename=bibliography.rdf\n\n";     
   print $bib;

#-----------------------------------------------------------------------------
sub getBib{
    my($bibList)=@_;
    my $bibStr="";
    foreach my $bib (@$bibList){
        if($bib->{'author'} ne ""){
            my ($last, $first)=extractAuthFirstLastName($bib->{'author'});
            $bib->{'lastName'} = $last;
            $bib->{'firstName'} = $first;
        }
        my $sumIndex=1;
        foreach my $s(@{$bib->{'summary'}}){
             $s->{'index'} =$sumIndex++; 
        }
        my $userNote = $b->{'userNote'};
        $bib->{'userNote'}      = encode('utf8',$userNote);
        push @{$bib->{'summary'}} ,{item=>$bib->{'userNote'} ,index=>$sumIndex} if($userNote && $userNote ne "");

    }


    my $rootDir   = Opals::Context->config('rootDir');

    my $template = HTML::Template->new(    
                filename            => "rdfFormat.tmpl",
                path                => "$rootDir/htdocs/theme/opals/util/bibsrc/",
                global_vars         => 1,
                die_on_bad_params   => 0,
                cache               => 1,
                shared_cache        => 0,
                loop_context_vars   => 1,);
   my $recDetailUrlBase = "http://" .$ENV{'HTTP_HOST'};
   if($ENV{'SERVER_PORT'} ==443){
       $recDetailUrlBase  ="https://" .$ENV{'HTTP_HOST'};

   }
   elsif($ENV{'SERVER_PORT'} !=80){
        $recDetailUrlBase .=":" . $ENV{'SERVER_PORT'} ;
   }
  
   $recDetailUrlBase .= "/bin/search/recDetailPage?rid=";

   $template->param(
                    recDetailUrlBase=>$recDetailUrlBase,
                    bibliography=>$bibList);
    
   return  $template->output();
}



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

sub getBibList_bk{
    my ($dbh,$sessionID)=@_;

    my @ridList=();
    my $sql="select distinct m.rid,s.note as userNote  from opl_sessionVar s
                            inner join opl_marcRecord m using(rid)
                            inner join opl_item i using(rid)                               
                         where var ='bibliography' && ssid= ? && i.barcode not regexp '^\_\_\_' ";

    my $sth=$dbh->prepare($sql);
    $sth->execute($sessionID);

    my $marcXmlParser=undef;
    my $indexConfFile  = Opals::Context->config('sIndexConfig');
    $marcXmlParser=Opals::MarcXmlParser->new($indexConfFile) if (!defined $marcXmlParser);
    my @field2trim= qw( author title subtitle placePublication namePublisher datePublication);
    my $linkIndex=1;
    while (my $b=$sth->fetchrow_hashref){
        my $rid  = $b->{'rid'};
        my $fname=recordPath($rid)."/$rid.xml";
        $bib=$marcXmlParser->getRecInfoGeneral_file($fname);
        my $userNote = $b->{'userNote'};
        $bib->{'userNote'}      = encode('utf8',$userNote);
        if($bib->{'author'} ne ""){
            my ($last, $first)=extractAuthFirstLastName($bib->{'author'});
            $bib->{'lastName'} = $last;
            $bib->{'firstName'} = $first;
        }
        my $sumIndex=1;
        foreach my $s(@{$bib->{'summary'}}){
             $s->{'index'} =$sumIndex++; 
        }
        push @{$bib->{'summary'}} ,{item=>$bib->{'userNote'} ,index=>$sumIndex} if($userNote && $userNote ne "");
        
        $bib->{'rid'}           = $rid; 
        foreach my $f(@field2trim){
            $bib->{$f}=trimPunctuation($bib->{$f});
        }
        $bib->{'linkIndex'}=$linkIndex++;
        push @ridList, $bib;
    }
    $sth->finish;
    return @ridList;
   
}
#-----------------------------------------------------------------------------
sub extractAuthFirstLastName{
    my ($authName)=@_;
    my ($last, $first)=($authName,"");
   if($authName =~ m/(.*),(.*)/i){
        $last=$1;
        $first=$2;
   }
   elsif($authName =~ m/(.*)[\s]+(.*)/i){
        $last=$2;
        $first=$1;
   }
   return ($last, $first);
    
}
#-----------------------------------------------------------------------------
#Mon, Jan 31, 2011 @ 14:42:04 EST
sub trimPunctuation{
    my($str)=@_;
    $str =~ s/[,;:.]+$//g;
    return $str;
}



#-----------------------------------------------------------------------------
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;
}

###############################################################################





