package BookPub::Import::Importer::BBCAudio::Version1;

use strict;

use Data::Dumper;

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

use constant DIG_PROD => '\bdig';    # regex to identify the product types we care about

# map of data columns
my %FIELD_MAP = (
    isbn13     => 0,
    svcProdID  => 1,
    title      => 2,
    format     => 3,
    date       => 4,
    returns    => 9,
    sales      => 10,
    netRevenue => 12,
    listPrice  => 13,
);

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

    my $saleCount    = 0;
    my $lines        = $args{lines};
    my $DIG_PROD     = DIG_PROD;
    my %skippedSales = ( revenue => 0, units => 0 );

    for ( my $i = 1 ; $i < scalar @$lines ; $i++ ) {
        my $isbn13  = $lines->[$i][ $FIELD_MAP{isbn13} ];
        my $title   = $lines->[$i][ $FIELD_MAP{title} ];
        my $revenue = $lines->[$i][ $FIELD_MAP{netRevenue} ];
        next unless ( $revenue =~ m/\d/ and ( $isbn13 or $title ) );

        # currently, they're only supplying the last day of the month
        #$beginDate = $endDate = Common::Util::normalize_date($lines->[$i][ $FIELD_MAP{date} ]);
        my ( $beginDate, $endDate ) = $self->_getDates( date_begin => $lines->[$i][ $FIELD_MAP{date} ] );
        unless ( $beginDate and $endDate ) {
            Common::Log::Print( 'bad date: ' . $lines->[$i][ $FIELD_MAP{date} ] );
            $self->errstr('bad date format');
            return undef;
        }

        # we _should_ only see 'libdig' but i'll leave the rest here for reference
        $title =~ s/\s*\-\s*(libdig|mp3cd|ucd)\s*$//;
        my $svcProdID = $lines->[$i][ $FIELD_MAP{svcProdID} ];
        my $returns   = $lines->[$i][ $FIELD_MAP{returns} ];
        my $sales     = $lines->[$i][ $FIELD_MAP{sales} ];
        my $listPrice = $lines->[$i][ $FIELD_MAP{listPrice} ];
        my $formatTmp = $lines->[$i][ $FIELD_MAP{format} ];

        my $units = $sales - $returns;
        next unless $units;
        my $unitPrice = $revenue / $units;

        unless ( $formatTmp =~ m/$DIG_PROD/i ) {
            $skippedSales{revenue} += $revenue;
            $skippedSales{units}   += $units;
            next;
        }

        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->purchaseType(BookPub::DB::Item::Sale::kPurchaseTypeDownload);

        # for now, we're only seeing audiobooks
        $saleRec->formatType(BookPub::DB::Item::Sale::kFormatTypeAudioUnknown);

        $saleRec->dateBegin($beginDate);
        $saleRec->dateEnd($endDate);

        $saleRec->serviceProductID($svcProdID);
        $saleRec->units($units);
        $saleRec->listPrice($listPrice);
        $saleRec->discount( BookPub::Import::Importer::CalculateDiscount( $unitPrice, $listPrice ) );
        $saleRec->unitPrice($unitPrice);
        $saleRec->revenue($revenue);

        $saleRec->rFormat($formatTmp);
        $saleRec->rIsbn13($isbn13);
        $saleRec->rTitle($title);
        $saleRec->rSales($sales);
        $saleRec->rReturns($returns);
        $saleRec->rListPrice($listPrice);
        $saleRec->rRevenue($revenue);

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

    Common::Log::Print("Phys products skipped: units->$skippedSales{units} revenue->$skippedSales{revenue}");
    return $saleCount;
}

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