package BookPub::Import::Importer::RandomHouse;

use strict;

use Common::Country;

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

sub _fieldMap {
    {
        currencyCode => 'H',
        countryCode  => 'N',

        dateBegin        => 'B',
        rFormat          => 'E',
        rClientProductID => 'D',
        isbn             => 'C',

        rTitle     => 'M',
        rAuthor    => 'L',
        rSales     => 'J',
        rReturns   => 'J',
        rDiscount  => 'I',
        rListPrice => 'G',
    };
}

sub _unverifiedFieldMap {
    {
        subscriptionFlag => 'F',
        returnFlag       => 'G',
        rowType          => 'A',
    };
}

sub priceType   { 'rrp' }
sub productType { BookPub::DB::Item::Sale::kProductTypeEBook }

sub _dateFormat { [ 'iso', 'numerical_year_first' ] }

sub _isHeader {
    my $self = shift;
    my $type = $self->_getByFieldName('rowType') || return;
    return lc($type) eq 'h';
}

sub _processHeader {
    my $self = shift;

    if ( $self->_isHeader() ) {
        $self->{_returnFlag}       = $self->_getByFieldName('returnFlag');
        $self->{_subscriptionFlag} = $self->_getByFieldName('subscriptionFlag');
    }
}

sub _isValidSaleRecord {
    my $self = shift;
    my $type = $self->_getByFieldName('rowType') || return;
    return lc($type) eq 'd';
}

sub rListPrice {
    my $self = shift;

    return if ( $self->isFree() eq 'Y' );
    return $self->_getByFieldName('rListPrice');
}

sub isFree {
    my $self  = shift;
    my $price = $self->_getByFieldName('rListPrice');

    return $price ? 'N' : 'Y';
}

sub purchaseType {
    my $self = shift;

    if ( $self->{_subscriptionFlag} && lc( $self->{_subscriptionFlag} ) eq 'y' ) {
        return BookPub::DB::Item::Sale::kPurchaseTypeSubscriptionDL;
    } else {
        return BookPub::DB::Item::Sale::kPurchaseTypeDownload;
    }
}

sub rReturns {
    my $self  = shift;
    my $type  = $self->{_returnFlag};
    my $value = $self->_getByFieldName('rReturns');

    return $type && lc($type) eq 'y' ? $value : 0;
}

sub rSales {
    my $self  = shift;
    my $type  = $self->{_returnFlag};
    my $value = $self->_getByFieldName('rSales');

    return $type && lc($type) eq 'y' ? 0 : $value;
}

sub rRevenue {
    my $self = shift;

    return if ( $self->isFree() eq 'Y' );

    my $discount  = $self->rDiscount() || 0;
    my $listPrice = $self->rListPrice  || return;
    my $units     = $self->units;

    return ( $listPrice - ( $listPrice * $discount ) ) * $units;
}

sub formatType { }

sub countryCode {
    my $self = shift;

    # If a country code isn't specified in the data row, then default to US.
    # See case 13218
    my $code = $self->_getByFieldName('countryCode') || return 'US';

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

1;
