#!/usr/bin/perl 
use lib("/www/opals/module");
use strict;
use Getopt::Std;
use Opals::Constant; 
use Date::Calc::Object qw(
    :all
);
use Digest::SHA qw(
    sha1_hex
    sha512_hex
);

use POSIX qw(
    ceil
    floor
);

use Text::CSV_XS;

use LWP::UserAgent;
use HTTP::Request::Common;
use JSON;
my %options = ();
getopts("f:",\%options);
my $bisacfile = $options{f};
if (! -f $bisacfile) {
    print "Usage: $0  -f BISAC CSV FILE \n";
    exit 1;
}



open BISAC ,"<$bisacfile";
my $line="";
my $count=0;
my $fieldIndex={code    =>{text=>'BISAC1_CODE',      index=>-1},
                literal =>{text=>'BISAC1_LITERAL',   index=>-1}
               };


my @data=();
               
while (<BISAC>){
    push @data,$_;
}

my $csv = Text::CSV_XS->new({ binary => 1 });
my $hdrStr=shift(@data);
$csv->parse($hdrStr);
my @headers=$csv->fields();    
for(my $i=0; $i<scalar(@headers);$i++){
    foreach my $f(keys %$fieldIndex){
        my $h=$fieldIndex->{$f}->{'text'};
        if(@headers[$i] =~ m/^$h$/gi){
            $fieldIndex->{$f}->{'index'}=$i;
        }
    }
}


my ($i,$j)=($fieldIndex->{'code'}->{'index'},$fieldIndex->{'literal'}->{'index'});

if($i<0 || $j<0 ){
    print "Invalid Bisac file; it must be a CSV file and has at least the following 2 fields:\n";
    print "\tBISAC1_CODE\n\tBISAC1_LITERAL\n";
    exit 1;
}

my $docs="";

my $sbjRecFmt="<doc><field name=\"id\">%s</field><field name=\"source\">BISAC</field><field name=\"tag\">650</field><field name=\"ind1\">#</field><field name=\"ind2\">7</field><field name=\"subject\">%s</field><field name=\"subfields\">\$0%s\$2bisacsh\$a%s</field></doc>\n";
postRequest("<delete><query>ind2:7 AND source:BISAC</query></delete>");
postRequest("<commit/>");
my $sbjCodes={};
my $count=0;
my $sbjArr=[];
foreach my $row(@data){
    $csv->parse($row);
    my @fields=$csv->fields();

    my $code=@fields[$i];
    my $sbj=@fields[$j];
    if(!$sbjCodes->{$code} && $sbj ne "" ){
        push @$sbjArr,$sbj;
        $sbj =~ s/&/&amp;/g;
        $sbjCodes->{$code}=1;
        my $doc=sprintf($sbjRecFmt,$code,$sbj,$code,$sbj);
        print "$doc\n";
        postRequest("<add>$doc</add>");
        $count++;
    }
}
print "$count\n";
postRequest("<commit/>");
@$sbjArr=sort @$sbjArr;
open BISAC,">/tmp/bisacsh.js"; print BISAC "var bisacsh=", to_json($sbjArr);close BISAC;

############################################################
sub postRequest{
    my ($xml)=@_;
    my($sHost,$sPort,$sDatabase) =("localhost","8983","sbjAuthority");

    my $url="http://$sHost:$sPort/solr/$sDatabase/update" ;
    #my $url="http://$sHost:$sPort/solr/update" ;

    my $req = HTTP::Request->new( POST => $url );
    my $timeout = 600;
    my $ua        = LWP::UserAgent->new(agent => 'OPALS');
    $ua->timeout($timeout);
    $ua->agent("SolrHTTPUpdateHandlerAgent");
    $req->content_type('Content-type:text/xml; charset=utf-8');
    $req->content($xml);
    my $res = $ua->request($req);

    
}

