package BookPub::Import::Importer::BarnesNoble::Version4;

use strict;
use Data::Dumper;

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

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

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

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

sub _fieldMap {
    {
        rIsbn13    => 'A',
        rImprint   => 'C',
        rTitle     => 'D',
        rSubtitle  => 'D',
        rAuthor    => 'E',
        dateBegin  => 'G',
        rSales     => 'J',
        rReturns   => 'K',
        rUnitPrice => 'L',
        rRevenue   => 'N',
        rListPrice => 'M',
    };
}

sub _unverifiedFieldMap {
    { eGiftDateBegin => 'I', };
}

sub countryCode { 'US' }

sub currencyCode { 'USD' }

sub priceType { 'agency' }

sub productType { BookPub::DB::Item::Sale::kProductTypeEBook }

sub purchaseType { BookPub::DB::Item::Sale::kPurchaseTypeDownload }

sub rListPriceCurrency { 'USD' }

sub _getDateBegin {
    my $self = shift;

    # We'll use the eGift Date if that column is populated.
    my $date = $self->_getByFieldName('eGiftDateBegin');

    if ( !$date ) {
        $date = $self->_getByFieldName('dateBegin');
    }

    return $date;
}

sub rRevenue {
    my $self = shift;

    my $revenue = $self->SUPER::rRevenue();

    $revenue =~ s/,//g;

    my $sales = $self->rSales || 0;
    $sales =~ s/,//g;

    my $returns = $self->rReturns || 0;
    $returns =~ s/,//g;

    my $units = $sales + $returns;

    if ( $revenue > 0 && $units < 0 ) {
        $self->fail("Positive revenue found with negative units");
        return undef;
    }

    if ( $revenue < 0 && $units > 0 ) {
        $self->fail("Negative revenue found with positive units");
        return undef;
    }

    return $revenue;
}

sub rSales {
    my $self = shift;

    my $sales = $self->SUPER::rSales();
    $sales =~ s/,//g;

    if ( $sales < 0 ) {
        $self->fail("Sales cannot be negative");
        return undef;
    }

    return $sales;
}

sub rReturns {
    my $self = shift;

    my $returns = $self->SUPER::rReturns();
    $returns =~ s/,//g;

    if ( $returns > 0 ) {
        $self->fail("Returns cannot be positive");
        return undef;
    }

    return $returns;
}

sub units {
    my $self = shift;

    my $sales = $self->rSales || 0;
    $sales =~ s/,//g;

    my $returns = $self->rReturns || 0;
    $returns =~ s/,//g;

    # raw returns are provided as negative numbers
    return $sales + $returns;
}

sub rTitle {
    my $self = shift;

    my $title = $self->SUPER::rTitle();

    if ( $title =~ /(.+):.+/ ) {
        $title = $1;
    }

    return $title;
}

sub rSubtitle {
    my $self = shift;

    my $title = $self->SUPER::rSubtitle();
    my $subtitle;

    if ( $title =~ /.+: (.+)/ ) {
        $subtitle = $1;
    }

    return $subtitle;
}

1;
