#!/usr/bin/perl 
use lib("/www/opals/module");
use strict;
use Getopt::Std;
use HTTP::Request::Common;
require LWP::UserAgent;
use JSON;
use Date::Parse;
use Time::Local;
use POSIX qw(strftime);
use Text::CSV_XS;

my %options = ();
getopts("f:",\%options);
my $lexileFile = $options{f};
if (!$lexileFile || ! -f $lexileFile) {
    print "Usage: $0 -f LEXILE_FILE \n";
    exit 1;
}

my $ua = new LWP::UserAgent;
$ua->timeout(20);
my $usr = 'Melchior';
my $pass = 'Lexile';
my $host="https://fabapi.lexile.com";
my $lexileTbl=getLexileFromFile($lexileFile);
my ($yw,$isbn13,$code,$lexile,$nextUrl);
my $nextUrl ="/api/fab/v2.1/book/?timestamp__gte=2014-02-01&format=json&limit=50";
getLexileFromHTTP($nextUrl);
open OUT,">/tmp/lexile_1.csv";
print OUT "year-weekNo","ISBN13","CODE","LEXILE\n";
foreach my $yw(sort keys %$lexileTbl){
    foreach my $isbn13(keys %{$lexileTbl->{$yw}}){
        $code=$lexileTbl->{$yw}->{$isbn13}->{'code'};
        $lexile=$lexileTbl->{$yw}->{$isbn13}->{'lexile'};
        print OUT "\"$yw\",\"$isbn13\",\"$code\",\"$lexile\"\n";


    }
}
close  OUT;
#===================================================================================

sub getYearWeekNo{
    my ($date)=@_;
    $date="2010-01-01" if(!defined $date || $date !~ m/^\d\d\d\d-\d\d-\d\d/ ); 
    my ($ss,$mm,$hh,$day,$month,$year,$zone) = strptime($date,"%y-%m-%d");
    $year +=1900;
    my $epoch = timelocal($ss,$mm,$hh, $day, $month , $year);
    my $week  = strftime( "%U", localtime( $epoch ) );
    return "$year-$week";

}
#===================================================================================
sub getLexileFromHTTP{
    my($url)=@_;
    my ($yw,$isbn13,$code,$lexile,$nextUrl);
    my $lArr=[];
    $nextUrl=$url;
    while($nextUrl && $nextUrl ne ""){
        my $request = GET "$host$nextUrl";
        $request->authorization_basic($usr, $pass);
        my $resp = $ua->request($request);
        if($resp->is_success){
            my $lexileJson = decode_json($resp->content);
            $nextUrl= $lexileJson->{'meta'}->{'next'};
            foreach my $lObj(@{$lexileJson->{'objects'}}){
                $isbn13 =$lObj->{'ISBN13'};
                $code=$lObj->{'lexile_code'};
                $lexile =$lObj->{'lexile'};
                $yw=getYearWeekNo($lObj->{'timestamp'});
                $lexileTbl->{$yw} ={} if(!$lexileTbl->{$yw});
                $lexileTbl->{$yw}->{$isbn13}={code=>$code,lexile=>$lexile};
            }
        }

        print "$nextUrl \n";
        sleep 2;
    }
}
#===================================================================================

sub getLexileFromFile{
    my ($file)=@_;
    my $csv = Text::CSV_XS->new({ binary => 1 });
    open LEXILE,"<$file";
    my  $lexileTbl={};
    #skip first line
     (<LEXILE>);
    
    while(<LEXILE>){
        $csv->parse($_);
        my ($yw,$isbn13,$code,$lexile,$modDate)=$csv->fields();
        $lexileTbl->{$yw} ={} if(!$lexileTbl->{$yw});
        $lexileTbl->{$yw}->{$isbn13}={code=>$code,lexile=>$lexile};

    }
    return $lexileTbl;
}
