package BookPub::Import::Importer::EBook::Version3;

use strict;

use lib '/app/tools/common/lib';
use Common::Util;
use Common::Log;
use Common::Assert;

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

my %_fieldMap = (
    imprint       => 2,
    title         => 3,
    author        => 4,
    print_isbn13  => 5,
    e_isbn13      => 6,
    format_isbn13 => 7,
    format        => 8,
    date          => 11,
    country       => 14,
    currency      => 15,    # may also contain agency flag
    list_price    => 17,
    discount      => 20,
    refund_flag   => 22,
);

sub _getFieldMap {
    return \%_fieldMap;
}

sub _getColumnValue {
    my ( $self, $line, $colName ) = @_;

    return undef unless defined $self->{fieldMap}{$colName};
    return $line->[ $self->{fieldMap}{$colName} ];
}

#public methods

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

    my $lines = $args{lines};
    my $saleCount;

    $self->{fieldMap} = $self->_getFieldMap();

    for ( my $i = 1 ; $i < scalar @$lines ; $i++ ) {
        my $line    = $lines->[$i];
        my $linenum = $i + 1;

        my $isbn13 = $self->_getColumnValue( $line, 'format_isbn13' )
          || $self->_getColumnValue( $line, 'e_isbn13' );
        next unless ($isbn13);

        my $dateStr = $self->_getColumnValue( $line, 'date' );
        my $datePurchased = Common::Util::normalize_date($dateStr);
        unless ($datePurchased) {
            $self->errstr('failed to parse date');
            Common::Log::Print("failed getting date from $dateStr");
            return undef;
        }

        my $imprint     = $self->_getColumnValue( $line, 'imprint' );
        my $title       = $self->_getColumnValue( $line, 'title' );
        my $author      = $self->_getColumnValue( $line, 'author' );
        my $format      = $self->_getColumnValue( $line, 'format' );
        my $country     = $self->_getColumnValue( $line, 'country' );
        my $currencyTmp = $self->_getColumnValue( $line, 'currency' );
        my $listPrice   = $self->_getColumnValue( $line, 'list_price' );
        my $discount    = $self->_getColumnValue( $line, 'discount' );
        my $revenue = $listPrice * ( 1 - ( $discount / 100 ) );
        my $refundFlag = $self->_getColumnValue( $line, 'refund_flag' );

        # 'USD (Agency Model)'
        my ( $currency, $extra ) = $currencyTmp =~ m/^([A-Z]{3})\s(.*)/;
        $currency ||= $currencyTmp;
        my $agencyFlag = $extra =~ m/agency/i ? 'Y' : 'N';

        my $units = 1;    # none provided so we have to assume
        if ( $refundFlag eq 'REFUNDED' ) {
            $units *= -1;
            if ( $revenue > 0 ) {
                $self->errstr('invalid revenue for refund');
                Common::Log::Print('refund flag set but positive revenue');
            }
        }

        my $formatType = $self->_parseFormat($format);
        unless ($formatType) {
            $self->errstr("unknown format: $format");
            Common::Log::Print("unknown format '$format'");
            next;
        }

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

        $saleRec->productType(BookPub::DB::Item::Sale::kProductTypeEBook);
        $saleRec->purchaseType(BookPub::DB::Item::Sale::kPurchaseTypeDownload);
        $saleRec->formatType($formatType);
        $saleRec->lineNum($linenum);
        $saleRec->dateBegin($datePurchased);
        $saleRec->dateEnd($datePurchased);

        $saleRec->isAgency($agencyFlag);
        $saleRec->units($units);
        $saleRec->unitPrice( abs($revenue) );
        $saleRec->listPrice( abs($listPrice) );
        $saleRec->discount( BookPub::Import::Importer::CalculateDiscount( $revenue, $listPrice ) );
        $saleRec->revenue($revenue);
        $saleRec->currencyCode($currency);
        $saleRec->countryCode($country);

        $saleRec->rIsbn13($isbn13);
        $saleRec->rTitle($title);
        $saleRec->rAuthor($author);
        $saleRec->rImprint($imprint);
        $saleRec->rListPrice($listPrice);
        $saleRec->rDiscount( $discount / 100 );
        $saleRec->rRevenue($revenue);

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

    return $saleCount;
}

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