package BookPub::Import::Importer::ebrary::Version6;

use strict;

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

use lib '/app/tools/sale_import/lib/';
use Import::ValidationError;

use lib '/app/tools/bookpub/lib';
use base 'BookPub::Import::Importer';

sub _headerIdentifier { ( rTitle => 'Title' ) }

my %fieldMap = (
    serviceProductID  => 0,
    isbn13            => 1,
    title             => 4,
    author            => 3,
    listPrice         => 5,
    unitsDirect1Day   => 9,
    revenueDirect1Day => 10,
    units3rd1Day      => 11,
    revenue3rd1Day    => 12,
    unitsDirect7Day   => 15,
    revenueDirect7Day => 16,
    units3rd7Day      => 17,
    revenue3rd7Day    => 18,
);

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

    Log->info("Starting _preProcess");
    $self->SUPER::_preProcess(%args);

    foreach my $sheet ( @{ $args{sheets} } ) {
        foreach my $line (@$sheet) {

            # Since we're at the preProcess stage, it seems we have to reference rows by number.
            my $dateCell = $line->[0];
            if ( $dateCell =~ m/ebrary Title Revenue Report \(Short Term Loan\) (Q\d) (\d{4}) for/i ) {
                $self->{_dateBegin} = "$1-$2";
                last;
            }
        }
        if ( !$self->{_dateBegin} ) {
            $self->fail("Unable to find date in header");
        }
    }
}

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

    my $dateStr = $self->{_dateBegin};

    my ( $dateBegin, $dateEnd ) = $self->_getDates( date_begin => $dateStr, type => 'quarter' );
    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 = 9 ; $i < scalar @$lines ; $i++ ) {
        my $title  = $lines->[$i][ $fieldMap{title} ];
        my $isbn13 = $lines->[$i][ $fieldMap{isbn13} ];
        unless ( ( $title && $title ne 'Totals' ) or $isbn13 ) {
            Common::Log::Print("skip line $i - title: '$title', isbn: '$isbn13'");
            next;
        }
        my $subtitle;
        ( $title, $subtitle ) = BookPub::Import::Importer::ParseTitleAndSubtitle($title);

        my $listPrice        = $lines->[$i][ $fieldMap{listPrice} ];
        my $serviceProductID = $lines->[$i][ $fieldMap{serviceProductID} ];
        my $author           = $lines->[$i][ $fieldMap{author} ];
        if ( $author =~ m/^(.*)\(.+\)$/ ) {
            $author = $1;
        }

        my $unitsDirect1Day   = $lines->[$i][ $fieldMap{unitsDirect1Day} ];
        my $revenueDirect1Day = $lines->[$i][ $fieldMap{revenueDirect1Day} ];

        my $units3rd1Day   = $lines->[$i][ $fieldMap{units3rd1Day} ];
        my $revenue3rd1Day = $lines->[$i][ $fieldMap{revenue3rd1Day} ];

        my $unitsDirect7Day   = $lines->[$i][ $fieldMap{unitsDirect7Day} ];
        my $revenueDirect7Day = $lines->[$i][ $fieldMap{revenueDirect7Day} ];

        my $units3rd7Day   = $lines->[$i][ $fieldMap{units3rd7Day} ];
        my $revenue3rd7Day = $lines->[$i][ $fieldMap{revenue3rd7Day} ];

        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::kProductTypeEBook);
        $saleRec->purchaseType(BookPub::DB::Item::Sale::kPurchaseTypeLoan);
        $saleRec->formatType(BookPub::DB::Item::Sale::kFormatTypeEbrary);
        $saleRec->lineNum( $i + 1 );

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

        $saleRec->rIsbn13($isbn13);
        $saleRec->rTitle($title);
        $saleRec->rAuthor($author);
        $saleRec->serviceProductID($serviceProductID);
        $saleRec->rSubtitle($subtitle) if $subtitle;
        $saleRec->listPrice($listPrice);
        $saleRec->rListPrice($listPrice);

        if ($unitsDirect1Day) {
            my $unitPrice = $revenueDirect1Day / $unitsDirect1Day;
            $saleRec->units($unitsDirect1Day);
            $saleRec->discount( BookPub::Import::Importer::CalculateDiscount( $unitPrice, $listPrice ) );
            $saleRec->unitPrice($unitPrice);
            $saleRec->revenue($revenueDirect1Day);
            $saleRec->rUnits($unitsDirect1Day);
            $saleRec->rRevenue($revenueDirect1Day);

            $self->_insertSale( sale => $saleRec );
            $saleCount++;
        }

        if ($units3rd1Day) {
            my $unitPrice = $revenue3rd1Day / $units3rd1Day;
            $saleRec->units($units3rd1Day);
            $saleRec->discount( BookPub::Import::Importer::CalculateDiscount( $unitPrice, $listPrice ) );
            $saleRec->unitPrice($unitPrice);
            $saleRec->revenue($revenue3rd1Day);
            $saleRec->rUnits($units3rd1Day);
            $saleRec->rRevenue($revenue3rd1Day);

            $self->_insertSale( sale => $saleRec );
            $saleCount++;
        }

        if ($unitsDirect7Day) {
            my $unitPrice = $revenueDirect7Day / $unitsDirect7Day;
            $saleRec->units($unitsDirect7Day);
            $saleRec->discount( BookPub::Import::Importer::CalculateDiscount( $unitPrice, $listPrice ) );
            $saleRec->unitPrice($unitPrice);
            $saleRec->revenue($revenueDirect7Day);
            $saleRec->rUnits($unitsDirect7Day);
            $saleRec->rRevenue($revenueDirect7Day);

            $self->_insertSale( sale => $saleRec );
            $saleCount++;
        }

        if ($units3rd7Day) {
            my $unitPrice = $revenue3rd7Day / $units3rd7Day;
            $saleRec->units($units3rd7Day);
            $saleRec->discount( BookPub::Import::Importer::CalculateDiscount( $unitPrice, $listPrice ) );
            $saleRec->unitPrice($unitPrice);
            $saleRec->revenue($revenue3rd7Day);
            $saleRec->rUnits($units3rd7Day);
            $saleRec->rRevenue($revenue3rd7Day);

            $self->_insertSale( sale => $saleRec );
            $saleCount++;
        }
    }

    return $saleCount;
}

1;
