package BookPub::Import::Importer::SimplyAudio::Version4;

use strict;

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

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

my %fieldMap = (
    dateSheet     => 0,
    dateCell      => 0,
    dataSheet     => 1,
    isbn13        => 0,
    title         => 1,
    unitsClub     => 2,
    listPriceClub => 3,
    discountClub  => 4,
    revenueClub   => 5,
    unitsALC      => 6,
    listPriceALC  => 3,
    discountALC   => 8,
    revenueALC    => 9,
);

#public methods

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

    # scan the summary sheet to find the date range for this file
    my $dateStr;
    foreach my $line ( @{ $args{sheets}[ $fieldMap{dateSheet} ] } ) {
        if ( $line->[ $fieldMap{dateCell} ] =~ m#\d+\W\d+\W\d+\s*-\s*\d+\W+\d+\W+\d+# ) {
            $dateStr = $line->[ $fieldMap{dateCell} ];
            last;
        }
    }
    unless ($dateStr) {
        $self->errstr('failed to find date');
        return undef;
    }

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

    my $lines = $args{sheets}[ $fieldMap{dataSheet} ];
    for ( my $i = 2 ; $i < scalar @$lines ; $i++ ) {
        my $title  = $lines->[$i][ $fieldMap{title} ];
        my $isbn13 = $lines->[$i][ $fieldMap{isbn13} ];
        unless ( $title or $isbn13 ) {
            Common::Log::Print("skip line $i - title: '$title', isbn: '$isbn13'");
            next;
        }
        my $subtitle;
        ( $title, $subtitle ) = BookPub::Import::Importer::ParseTitleAndSubtitle($title);

        my $listPriceALC  = $lines->[$i][ $fieldMap{listPriceALC} ];
        my $unitsALC      = $lines->[$i][ $fieldMap{unitsALC} ];
        my $discountALC   = $lines->[$i][ $fieldMap{discountALC} ];
        my $revenueALC    = $lines->[$i][ $fieldMap{revenueALC} ];
        my $listPriceClub = $lines->[$i][ $fieldMap{listPriceClub} ];
        my $unitsClub     = $lines->[$i][ $fieldMap{unitsClub} ];
        my $discountClub  = $lines->[$i][ $fieldMap{discountClub} ];
        my $revenueClub   = $lines->[$i][ $fieldMap{revenueClub} ];

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

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

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

        $saleRec->rIsbn13($isbn13);
        $saleRec->rTitle($title);
        $saleRec->rSubtitle($subtitle) if $subtitle;

        if ($unitsALC) {
            $saleRec->listPrice($listPriceALC);
            $saleRec->rListPrice($listPriceALC);
            my $unitPrice = $revenueALC / $unitsALC;
            $saleRec->units($unitsALC);
            $saleRec->discount( BookPub::Import::Importer::CalculateDiscount( $unitPrice, $listPriceALC ) );
            $saleRec->unitPrice($unitPrice);
            $saleRec->revenue($revenueALC);

            $saleRec->rUnits($unitsALC);
            $saleRec->rDiscount($discountALC);
            $saleRec->rRevenue($revenueALC);

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

        if ($unitsClub) {
            $saleRec->listPrice($listPriceClub);
            $saleRec->rListPrice($listPriceClub);
            my $unitPrice = $revenueClub / $unitsClub;
            $saleRec->units($unitsClub);
            $saleRec->discount( 1 - $unitPrice / $listPriceClub );
            $saleRec->unitPrice($unitPrice);
            $saleRec->revenue($revenueClub);

            $saleRec->rUnits($unitsClub);
            $saleRec->rDiscount($discountClub);
            $saleRec->rRevenue($revenueClub);

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

    return $saleCount;
}

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