package BookPub::Import::Importer::SpokenNetwork::Version1;

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 = (
    summaryRow => 1,
    currency   => 3,
    totalUnits => 4,
    totalRev   => 5,
    date       => 0,
    author     => 1,
    svcProdID  => 2,
    title      => 3,
    isbn       => 4,
    unitPrice  => 5,
    units      => 6,
    discount   => 7,    # all 0 so far
    revenue    => 8,
    country    => 9,
);

sub _importLines {
    my $self = shift;
    my %args = @_;
    my $saleCount;
    my $lines      = $args{lines};
    my $totalRev   = 0;
    my $totalUnits = 0;

    # the first 2 rows are summary/control totals so let's use them for self validation
    my $summaryRow = $lines->[ $fieldMap{summaryRow} ];
    my $currency   = $summaryRow->[ $fieldMap{currency} ];
    my %summary    = (
        units   => $summaryRow->[ $fieldMap{totalUnits} ],
        revenue => $summaryRow->[ $fieldMap{totalRev} ],
    );

    for ( my $i = 1 ; $i < scalar @$lines ; $i++ ) {
        my $revenue = $lines->[$i][ $fieldMap{revenue} ];
        unless ( $revenue =~ m/\d/ ) {
            Common::Log::Print("skip line $i - revenue: '$revenue'");
            next;
        }

        my $date      = $lines->[$i][ $fieldMap{date} ];
        my $author    = $lines->[$i][ $fieldMap{author} ];
        my $svcProdID = $lines->[$i][ $fieldMap{svcProdID} ];
        my $title     = $lines->[$i][ $fieldMap{title} ];
        my $isbn      = $lines->[$i][ $fieldMap{isbn} ];
        $isbn =~ s/-//g;
        my $unitPrice = $lines->[$i][ $fieldMap{unitPrice} ];
        my $units     = $lines->[$i][ $fieldMap{units} ];
        my $discount  = $lines->[$i][ $fieldMap{discount} ];
        my $country   = $lines->[$i][ $fieldMap{country} ];

        my $dateNorm    = Common::Util::normalize_date($date);
        my $countryCode = $Common::Consts::COUNTRY_CODE{ lc $country };
        unless ($countryCode) {
            $self->errstr("unknown country: $country");
            Common::Log::Print("unknown country: '$country'");
        }

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

        # defaults
        $saleRec->currencyCode($currency);
        $saleRec->productType(BookPub::DB::Item::Sale::kProductTypeAudioBook);
        $saleRec->purchaseType(BookPub::DB::Item::Sale::kPurchaseTypeDownload);
        $saleRec->formatType(BookPub::DB::Item::Sale::kFormatTypeAudioUnknown);

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

        $saleRec->serviceProductID($svcProdID);
        $saleRec->units($units);

        # they supply unit price but it's not the same as rev/units
        $saleRec->unitPrice( $revenue / $units );
        $saleRec->discount($discount);
        $saleRec->revenue($revenue);
        $saleRec->countryCode($countryCode);

        length $isbn == 13 ? $saleRec->rIsbn13($isbn) : $saleRec->rIsbn10($isbn);
        $saleRec->rAuthor($author);
        $saleRec->rTitle($title);
        $saleRec->rDiscount($discount);
        $saleRec->rUnitPrice($unitPrice);
        $saleRec->rUnits($units);
        $saleRec->rRevenue($revenue);

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

    unless ( $totalUnits == $summary{units} and abs( $totalRev - $summary{revenue} ) < .01 ) {
        $self->errstr('totals do not match');
        Common::Log::Print("units: $totalUnits <-> $summary{units}, rev: $totalRev <-> $summary{revenue}");
    }

    return $saleCount;
}

1;
