#!/usr/bin/perl

use strict;

use lib '/app/tools/sale_import/lib';
use Sale::File;

use lib '/app/tools/rps/lib';
use RPS::File::File;

$| = 1;
my @columns = qw(
  productType
  formatType
  dateBegin
  dateEnd
  serviceProductID
  albumName
  artistName
  trackName
  upc
  isrc
  units
  price
  lineNum
  retail
  wholesaleRate
  priceType
  payoutType
  free
);

#note -- removed ppdConversion

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    = ();

if ( $importFile =~ /^\d+$/ )    # file id
{
    $fileObj = RPS::File::File->new( client_id => $cid, file_id => $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 = Sale::File->new( client_id => $cid );

$sf->{path} = $importFile;
my $sheets_aref     = [];
my $sheetnames_aref = [];
my $lines_aref      = [];

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 = Import::Service->new( 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,
);

print STDERR 'error: ' . $importer->errstr() . "\n" unless $success;
print STDERR "\nrecords: $COUNT\nunits: $UNITS\nrevenue: $TOTAL\n";
print STDERR "done!\n";

sub dump_row {
    my $record = shift;
    $TOTAL += $record->price() * $record->units();
    $UNITS += $record->units();
    $COUNT++;
    map { print $record->$_(), "\t" } @columns;
    print "\n";
}

