#!/usr/bin/perl

use strict;

use lib '/app/tools/bookpub/lib';
use BookPub::Sale::File;
use BookPub::Tracker::File;

use lib '/app/tools/common/lib';
use Common::RSApp;

$| = 1;
my @columns = qw(
  dateBegin
  dateEnd
  productType
  formatType
  purchaseType
  serviceProductID
  isAgency
  isFree
  units
  unitPrice
  revenue
  listPrice
  discount
  lineNum
  countryCode
  currencyCode
  rIsbn10
  rIsbn13
  rTitle
  rSubtitle
  rAuthor
  rImprint
  rNarrator
  rUnits
  rSales
  rReturns
  rAdjustments
  rFee
  rListPrice
  rDiscount
  rPromoCode
);

my $TOTAL = 0;
my $UNITS = 0;
my $COUNT = 0;

die "usage: $0 client_id /path/to/file [limit] [forced-service_id] [forced-version_num]\n" unless @ARGV;

my $cid        = shift @ARGV;
my $importFile = shift @ARGV;
my $fileName   = $importFile;
my $fileObj    = ();

my $appSingleton = Common::RSApp->new( clientID => $cid );

if ( $importFile =~ /^\d+$/ )    # file id
{
    $fileObj = BookPub::Tracker::File->new( fileID => $importFile );
    my $filePath = join( '/', $fileObj->FileDir(), $fileObj->FileName() );
    die "cannot find/read input file: $!\n" unless ( -r $filePath );
    $importFile = $filePath;
    $fileName   = $fileObj->OrigFileName();
} else {
    die "cannot find/read input file: $!\n" unless ( -r $importFile );
}

my $limit = shift @ARGV || 0;
my ( $serviceForce, $versionForce ) = @ARGV;
print STDERR "force with $serviceForce $versionForce\n" if ( $serviceForce && $versionForce );

my $sf = BookPub::Sale::File->new( client_id => $cid );

# yes, this violates encapsulation but it's just a test script
$sf->{path} = $importFile;

my $sheets_aref     = [];
my $sheetnames_aref = [];
my $lines_aref      = [];

print STDERR "read file $importFile\n";
if ( -B $importFile )    # binary, try excel since that's all we can do
{
    print STDERR "reading excel file\n";
    my $sheet_data = $sf->_read_excel_file() || return undef;

    $sheets_aref     = $sheet_data->[0];
    $sheetnames_aref = $sheet_data->[1];

    # for backwards compatibility
    $lines_aref = $sheets_aref->[0];
} elsif ( -T $importFile ) {
    print STDERR "reading text file\n";
    $lines_aref = $sf->_read_text_file( limit => $limit ) || return undef;

    # back-populate the single sheet
    $sheets_aref->[0] = $lines_aref;
}

my $i = 0;

#foreach (@$lines_aref)
#{
#print join(',', @$_) . "\n";
#last if ($i++ > 11);
#}

if ( $serviceForce && $versionForce ) {
    $sf->{service_id}  = $serviceForce;
    $sf->{version_num} = $versionForce;
} elsif ( $sf->PreParse($sheets_aref) ) {
    print STDERR "PreParse chose service & version\n";
} else {
    die "unidentified file type\n";
}

print STDERR "file service is $sf->{service_id} : $sf->{version_num}\npress enter to continue...";
my $enter = <STDIN>;

print STDERR "calling importer...\n\n";
print join( "\t", @columns ), "\n";

my $importer = BookPub::Import::Factory::GetImporter( service_id => $sf->{service_id}, version_num => $sf->{version_num} );
$importer->{fileServiceID} = $sf->{service_id};
$importer->{clientID}      = $cid;
my $success = $importer->_importLines(
    lines        => $lines_aref,
    sheets       => $sheets_aref,
    sheet_names  => $sheetnames_aref,
    version      => $sf->{version_num},
    OrigFileName => $fileName,
    dumper       => \&dump_row,
    file         => $fileObj,
);

my $errStr = $importer->errstr();
print STDERR "\nerror: $errStr\n" if $errStr;
print STDERR "\nrecords: $COUNT\nunits: $UNITS\nrevenue: $TOTAL\n";
print STDERR "done!\n";

sub dump_row {
    my $record = shift;

    eval { $importer->_validateSaleRec($record); };

    if ($@) {
        my $eMsg = $@;
        if ( ref $@ && $@->isa('Import::ValidationError') ) {
            $eMsg = $@->errorMessage();
        }
        print STDERR "validation error: $eMsg\n";
    }

    $TOTAL += $record->revenue;
    $UNITS += $record->units;
    $COUNT++;

    map { print $record->$_(), "\t" } @columns;
    print "\n";
}

