package BookPub::Import::Importer::eMusic::Version1;

use strict;

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

# map of data columns
my %fieldMap = (
    date          => [ 6, 3 ],
    detailHeader  => 1,
    serviceProdID => 0,
    isbn          => 1,
    author        => 2,
    narrator      => 3,
    title         => 4,
    sales         => 5,
    returns       => 6,
    units         => 7,
    unitPrice     => 8,
    listPrice     => 8,
    revenue       => 9,
);

#public methods

sub rDiscount { 0 }

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

    my $lines     = $args{lines};
    my $saleCount = 0;
    my $imprint   = 'Hachette Audio';    # default imprint for initial section of report

    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;
    }

    # determine where initial detail rows start
    my $detailStart = 0;
    for ( my $i = 1 ; $i < 50 ; $i++ ) {
        if ( $lines->[$i][ $fieldMap{detailHeader} ] =~ /statement detail/i ) {
            $detailStart = $i + 2;
            last;
        }
    }
    unless ($detailStart) {
        $self->errstr('unknown format');
        Common::Log::Print('cannot find detail rows');
        return undef;
    }

    for ( my $i = $detailStart ; $i < scalar @$lines ; $i++ ) {
        $self->{linenum} = $i;
        my $line   = $lines->[$i];
        my $units  = $line->[ $fieldMap{units} ];
        my $author = $line->[ $fieldMap{author} ];
        my $title  = $line->[ $fieldMap{title} ];
        my $isbn   = $line->[ $fieldMap{isbn} ];
        my $isbn13 = undef;
        my $isbn10 = undef;

        if ( $units !~ /^-{0,1}\d+$/ ) {
            next;
        }

        # new imprint section or blank line
        if ( $isbn =~ /^(.+)\snet units downloaded/i || !$isbn ) {
            $imprint = $1;
            next;
        }

        # isbn13 found, 13 digits
        elsif ( $isbn =~ /^\d{13}$/ ) {
            $isbn13 = $isbn;
        }

        # isbn10 found, either 10 digits or 9 and a trailing character
        elsif ( $isbn =~ /^\d{10}$/ || $isbn =~ /^\d{9}[A-Za-z]$/ ) {
            $isbn10 = $isbn;
        } else {
            $self->fail("Invalid ISBN format: $isbn");
        }

        $self->fail("Missing ISBN ($isbn), author ($author), or title ($title)") unless ( $isbn && $author ) || ( $isbn && $title );

        $units = $line->[ $fieldMap{units} ];
        my $svcProdID = $line->[ $fieldMap{serviceProdID} ];
        my $narrator  = $line->[ $fieldMap{narrator} ];
        my $sales     = $line->[ $fieldMap{sales} ];
        my $returns   = $line->[ $fieldMap{returns} ];
        my $unitPrice = $line->[ $fieldMap{unitPrice} ];
        my $listPrice = $line->[ $fieldMap{listPrice} ];
        my $revenue   = $line->[ $fieldMap{revenue} ];

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

        # defaults
        $saleRec->lineNum( $i + 1 );
        $saleRec->countryCode('US');
        $saleRec->currencyCode('USD');
        $saleRec->productType(BookPub::DB::Item::Sale::kProductTypeAudioBook);
        $saleRec->formatType(BookPub::DB::Item::Sale::kFormatTypeAudioMP3);    # ??
        $saleRec->purchaseType(BookPub::DB::Item::Sale::kPurchaseTypeDownload);

        $saleRec->dateBegin($dateBegin);
        $saleRec->dateEnd($dateEnd);
        $saleRec->serviceProductID($svcProdID);
        $saleRec->units($units);
        $saleRec->unitPrice($unitPrice);
        $saleRec->listPrice($listPrice);
        $saleRec->revenue($revenue);

        $saleRec->rIsbn13($isbn13);
        $saleRec->rIsbn10($isbn10);
        $saleRec->rTitle($title);
        $saleRec->rAuthor($author);
        $saleRec->rSales($sales);
        $saleRec->rReturns($returns);
        $saleRec->rUnits($units);
        $saleRec->rUnitPrice($unitPrice);
        $saleRec->rListPrice($listPrice);
        $saleRec->rRevenue($revenue);
        $saleRec->rImprint($imprint);
        $saleRec->rNarrator($narrator);

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

    return $saleCount;
}

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