package BookPub::Import::Importer::ACX::ACX;

use strict;

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

use Date::Calc qw( Add_Delta_YM );

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

sub _fieldMap {
    my $self = shift;

    my %fieldMap = (
        1 => {
            serviceProductID => 'C',
            countryCode      => 'G',
            dateBegin        => 'B2',
            rIsbn13          => 'F',
            rTitle           => 'D',
            rAuthor          => 'E',
            rUnits           => 'R',
            rDiscount        => 'H',
            rRevenue         => 'T',

        },
        2 => {
            serviceProductID => 'B',
            countryCode      => 'E',
            dateBegin        => 'J1',
            rTitle           => 'C',
            rAuthor          => 'D',
            rUnits           => 'P',
            rDiscount        => 'F',
            rRevenue         => 'S',

        },
    );

    return $fieldMap{ $self->_version() };
}

sub _unverifiedFieldMap {
    my $self = shift;

    my %fieldMap = (
        1 => {
            nonMemberCashRevenue => 'J',
            nonMemberCashUnits   => 'I',
            memberCreditRevenue  => 'M',
            memberCreditUnits    => 'L',
            memberCashRevenue    => 'P',
            memberCashUnits      => 'O',
        },
        2 => {
            nonMemberCashRevenue => 'H',
            nonMemberCashUnits   => 'G',
            memberCreditRevenue  => 'K',
            memberCreditUnits    => 'J',
            memberCashRevenue    => 'N',
            memberCashUnits      => 'M',
        },
    );

    return $fieldMap{ $self->_version() };
}

sub _useIsSaleRec              { 1 }
sub _autoParseTitleAndSubtitle { 1 }
sub _dateFormat                { 'text' }
sub _dateNormalization         { 'month' }
sub priceType                  { 'rrp' }
sub currencyCode               { 'USD' }
sub purchaseType               { BookPub::DB::Item::Sale::kPurchaseTypeDownload }
sub productType                { BookPub::DB::Item::Sale::kProductTypeAudioBook }

sub _getDateEnd { shift->_getDateBegin() }

sub rListPrice {
    my $self = shift;

    my $revenue = $self->_getByFieldName('nonMemberCashRevenue');
    my $units;
    if ( $revenue != 0 ) {
        $units = $self->_getByFieldName('nonMemberCashUnits');
    } else {
        $revenue = $self->_getByFieldName('memberCreditRevenue');
        if ( $revenue != 0 ) {
            $units = $self->_getByFieldName('memberCreditUnits');
        } else {
            $revenue = $self->_getByFieldName('memberCashRevenue');
            $units   = $self->_getByFieldName('memberCashUnits');
        }
    }

    if ( $units != 0 ) {
        return $revenue / $units;
    }
}

sub rDiscount {
    my $self = shift;

    my $discount = $self->_getByFieldName('rDiscount');
    $discount = 1 - $discount;

    return $discount;
}

sub _isSaleRec {
    my $self = shift;

    # We're going to check for the subtotal line
    my $discount         = $self->_getByFieldName('rDiscount');
    my $serviceProductID = $self->_getByFieldName('serviceProductID');
    if ( ( $discount =~ /total/i ) || ( $serviceProductID =~ /total/i ) ) {
        return 0;
    }

    # Need to ignore the mostly blank line that appears between tables
    if (   !$self->_getByFieldName('serviceProductID')
        && !$self->_getByFieldName('rTitle')
        && !$self->_getByFieldName('rAuthor')
        && !$self->_getByFieldName('countryCode')
        && !$self->_getByFieldName('rUnits')
        && !$self->_getByFieldName('rDiscount')
        && !$self->_getByFieldName('rRevenue') ) {
        return undef;
    }

    # Need to ignore the three footer lines of address and tax information
    if (   $self->_getByFieldName('serviceProductID')
        && !$self->_getByFieldName('rTitle')
        && !$self->_getByFieldName('rAuthor')
        && !$self->_getByFieldName('countryCode')
        && !$self->_getByFieldName('rUnits')
        && !$self->_getByFieldName('rDiscount')
        && !$self->_getByFieldName('rRevenue') ) {
        return undef;
    }

    return $self->SUPER::_isSaleRec();
}

1;
