package BookPub::Import::Importer::Macquarie::Version1;

use strict;

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

sub _headerIdentifier { ( rComments => 'subscription_type_purchased' ) }

sub _fieldMap {
    {
        countryCode    => 'U',
        rIsbn13        => 'X',
        rTitle         => 'AD',
        rComments      => 'B',
        rSales         => 'I',
        rReturns       => 'I',
        rListPrice     => 'W',
        rPurchasePrice => 'V',
        rRevenue       => 'W',
    };
}

sub purchaseType  { BookPub::DB::Item::Sale::kPurchaseTypeSubscriptionDL }
sub productType   { BookPub::DB::Item::Sale::kProductTypeEBook }
sub formatType    { BookPub::DB::Item::Sale::kFormatTypeHTML }
sub priceType     { 'rrp' }
sub currencyCode  { 'AUD' }
sub _useIsSaleRec { 1 }

sub rListPriceCurrency     { 'AUD' }
sub rPurchasePriceCurrency { 'AUD' }

# We're taking column B and putting it in the comments field to use as a SAN on
# the production system.  This is an array of all permissible values.  We'll
# check that in the rComments method
my @valid_sans_array = qw( data_licence
  data_license
  individual_user
  institution
  public_library
  school
  school_university );

# map the SAN array to a hash and check the value against it.  Fail if not found
sub rComments {
    my $self       = shift;
    my $san        = $self->_getByFieldName('rComments');
    my %valid_sans = map { $_ => 1 } @valid_sans_array;

    if ( !exists( $valid_sans{$san} ) ) {
        $self->fail( "Invalid SAN: " . $san );
    }

    return $san;

}

sub _isSaleRec {
    my $self  = shift;
    my $sales = $self->_getByFieldName('rSales');

    return if ( $sales =~ /Cancelled/i || $sales =~ /payment.*declined/i );
    return $self->SUPER::_isSaleRec();
}

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

    return $value eq "na" ? 'Y' : 'N';
}

sub units {
    my $self    = shift;
    my $sales   = $self->rSales;
    my $returns = $self->rReturns;

    return $sales - $returns;
}

sub rRevenue {
    my $self    = shift;
    my $revenue = $self->SUPER::rRevenue();
    my $sales   = $self->SUPER::rSales();

    if ( lc($sales) eq 'refund' || lc($sales) eq 'refunded' ) {
        return -1 * $revenue;
    } else {
        return $revenue;
    }
}

sub rTaxUnitPrice {
    my $self          = shift;
    my $purchasePrice = $self->SUPER::rPurchasePrice();
    my $listPrice     = $self->SUPER::rListPrice();
    my $tax           = $purchasePrice - $listPrice;

    if ( lc($purchasePrice) eq 'none' ) {
        return;
    } else {
        return $tax;
    }
}

sub rPurchasePrice {
    my $self          = shift;
    my $purchasePrice = $self->SUPER::rPurchasePrice();
    my $listPrice     = $self->SUPER::rListPrice();

    if ( lc($purchasePrice) eq 'none' ) {
        return $listPrice;
    } else {
        return $purchasePrice;
    }
}

sub rSales {
    my $self  = shift;
    my $sales = $self->SUPER::rSales();

    if ( lc($sales) eq 'refund' || lc($sales) eq 'refunded' ) {
        return;
    } else {
        return 1;
    }
}

sub rReturns {
    my $self    = shift;
    my $returns = $self->SUPER::rReturns();

    if ( lc($returns) eq 'refund' || lc($returns) eq 'refunded' ) {
        return 1;
    } else {
        return;
    }
}

sub _getDateBegin {
    my $self = shift;

    if ( $self->filename =~ /[_-](\d{4})(\d{2})\./ ) {
        return "$1-$2-01";
    } else {
        $self->fail( "Unable to determine date from filename: " . $self->filename );
    }
}

sub _getDateEnd {
    my $self = shift;
    my ( $dateStr, $date );

    $dateStr = $self->_getDateBegin();
    $date = new Common::Date( date => $dateStr, type => $self->_dateFormat() );

    return $date->monthEnd();
}

1;
