package BookPub::Import::Importer::PlayAway::Version2;

use strict;

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

use lib '/app/tools/bookpub/lib';
use BookPub::DB::Item::Sale;
use BookPub::Import::SaleRec;
use base 'BookPub::Import::Importer';

my %fieldMap = (
    title      => 1,
    channel    => 2,
    isbn13     => 3,
    sales      => 4,
    revSales   => 5,
    returns    => 6,
    revReturns => 7,
    units      => 8,
    revenue    => 9,
);

#public methods

sub _importLines {
    my $self = shift;
    my %args = @_;

    my $lines = $args{lines};
    my $saleCount;

    # no date so hard-code it for now
    my $dateStr = 'April_2010';

    #my $dateStr = $lines->[ $fieldMap{date}[0] ][ $fieldMap{date}[1] ];
    my ( $dateBegin, $dateEnd ) = $self->_getDates( date_begin => $dateStr );
    unless ( $dateBegin and $dateEnd ) {
        $self->errstr('invalid date');
        Common::Log::Print("invalid date string: '$dateStr'");
        return undef;
    }

    for ( my $i = 1 ; $i < scalar @$lines ; $i++ ) {
        my $title  = $lines->[$i][ $fieldMap{title} ];
        my $isbn13 = $lines->[$i][ $fieldMap{isbn13} ];
        unless ( $title and $isbn13 ) {
            Common::Log::Print("skip line $i - title: '$title', isbn: '$isbn13'");
            next;
        }

        my $channel    = $lines->[$i][ $fieldMap{channel} ];
        my $sales      = $lines->[$i][ $fieldMap{sales} ];
        my $revSales   = $lines->[$i][ $fieldMap{revSales} ];
        my $returns    = $lines->[$i][ $fieldMap{returns} ];
        my $revReturns = $lines->[$i][ $fieldMap{revReturns} ];
        my $units      = $lines->[$i][ $fieldMap{units} ];
        my $revenue    = $lines->[$i][ $fieldMap{revenue} ];

        if ( abs( ( $revSales + $revReturns ) - $revenue ) > 0.01 ) {
            $self->errstr('sales - returns != revenue');
            Common::Log::Print("$revSales + $revReturns != $revenue ($i)");
        }

        my $unitPrice =
            $units != 0 ? abs( $revenue / $units )
          : $sales != 0 ? $revSales / $sales
          :               0;
        unless ($unitPrice) {
            $self->errstr('invalid units');
            Common::Log::Print("invalid units: units: $units sales: $sales returns: $returns ($i)");
        }

        my $saleRec = BookPub::Import::SaleRec->new();

        $saleRec->lineNum( $i + 1 );
        $saleRec->dateBegin($dateBegin);
        $saleRec->dateEnd($dateEnd);

        $saleRec->isbn13($isbn13);
        $saleRec->title($title);
        $saleRec->channel($channel);
        $saleRec->sales($sales);
        $saleRec->returns( abs($returns) );
        $saleRec->units($units);
        $saleRec->unitPrice($unitPrice);
        $saleRec->totalRevenue($revenue);

        # defaults
        $saleRec->currencyCode('USD');
        $saleRec->countryCode('US');
        $saleRec->productType(BookPub::DB::Item::Sale::kProductTypeAudioBook);
        $saleRec->formatType(BookPub::DB::Item::Sale::kFormatTypeAudioUnknown);
        $saleRec->purchaseType(BookPub::DB::Item::Sale::kPurchaseTypePhysicalRetail);

        #$args{dumper}($saleRec);
        $self->_insertSale( sale => $saleRec );
        $saleCount++;
    }

    return $saleCount;
}

###
1;    # Play nicely.
###
