package RPS::Import::ADAPhysical::v4;

use strict;

use lib '/app/tools/rps/lib';
use base 'RPS::Import::Importer';

use Data::Dumper;

sub _headerIdentifier { ( upc => 'UPC' ) }

sub _fieldMap {
    {
        # Summary Tab
        dateBegin => 'B',
        dateEnd   => 'B',

        # Data
        labelName        => 'A',
        serviceID        => 'J',
        countryCode      => 'L',
        productType      => 'F',
        artistName       => 'C',
        serviceProductID => 'B',
        upc              => 'H',
        albumName        => 'D',
        wholesalePrice   => 'M',
        sales            => 'N',
        salesRevenue     => 'S',
        returns          => 'O',
        returnsRevenue   => 'T',
        units            => 'P',
        totalRevenue     => 'X',
    };
}

my %countryMap = ( 'ND' => 'GB' );

sub _unverifiedFieldMap {
    {
        distributionFee => 'V',
        returnFee       => 'W',
    };
}

sub currencyCode { 'GBP' }

sub countryCode {
    my $self = shift;
    my $cc = $self->_getByFieldName('countryCode') || return;
    return ( exists $countryMap{ uc $cc } ) ? $countryMap{ uc $cc } : $cc;
}

sub channel    { RPS::File::Sale::CHANNEL_RETAIL }
sub priceLevel { RPS::File::Sale::PLEVEL_FULL }

sub returns {
    my $returns = shift->SUPER::returns();
    return $returns && $returns < 0 ? $returns * -1 : $returns;
}

sub returnsRevenue {
    my $self    = shift;
    my $fee     = $self->_getByFieldName('returnFee') || 0;
    my $revenue = $self->SUPER::returnsRevenue + $fee;

    return $revenue ? $revenue * -1 : 0;
}

sub salesRevenue {
    my $self    = shift;
    my $fee     = $self->_getByFieldName('distributionFee') || 0;
    my $revenue = $self->SUPER::salesRevenue + $fee;

    return $revenue;
}

sub productType {
    my $type = shift->_getByFieldName('productType') || return;

    if ( $type =~ /^cd$/i ) {
        return RPS::File::Sale::TYPE_CD;
    } elsif ( $type =~ /^dvd/i ) {
        return RPS::File::Sale::TYPE_DVD;
    } elsif ( $type =~ /^vinyl/i ) {
        return RPS::File::Sale::TYPE_LP;
    }

    die "Unknown product type '$type'";
}

sub _processHeader {
    my $self = shift;

    return if ( $self->{_dateBegin} );

    my $date = $self->SUPER::_getDateBegin() || return;
    if ( $date =~ /(\d+\/\d+\/\d+) - (\d+\/\d+\/\d+)$/ ) {
        $self->{_dateBegin} = $1;
        $self->{_dateEnd}   = $2;
    }
}

sub _getDateBegin { shift->{_dateBegin} }
sub _getDateEnd   { shift->{_dateEnd} }

sub _dateFormat {
    return shift->_derivedDateFormat();
}

sub _derivedDateFormat {
    my $self = shift;
    my ( $ePartA, $ePartB );

    my ( $sPartA, $sPartB ) = $self->_getDateBegin() =~ /^(\d{2})\/(\d{2})/;
    my ( $ePartA, $ePartB ) = $self->_getDateEnd() =~ /^(\d{2})\/(\d{2})/;

    return unless ( $sPartA && $sPartB && $ePartA && $ePartB );

    return 'us'  if ( $sPartA == $ePartA );
    return 'eur' if ( $sPartB == $ePartB );
}

#  We have disabled validation for this importer because there are some assumptions
#  in the base importer in question.  Specifically, negative sales units when the
#  file contains a sale and return column.

sub _validateSaleTotalSum {
    my ( $self, $saleRec ) = @_;

    my $salesRevenue = $saleRec->salesRevenue ? $saleRec->salesRevenue : 0;
    my $totalRevenue = $saleRec->totalRevenue;

    if ( ( ( abs($salesRevenue) - abs($totalRevenue) ) > .01 ) ) {
        die Import::ValidationError->new( $saleRec,
            "Sales revenue $salesRevenue does not match total revenue $totalRevenue for sale with no returns" );
    }
}

sub _validateSales {
    my ( $self, $saleRec ) = @_;

    my $sales = $saleRec->sales;

    if ( !defined $sales ) {
        die Import::ValidationError->new( $saleRec, "Sales not defined for physical sale" );
    }

    if ( $sales !~ /^-?\d+$/ ) {
        die Import::ValidationError->new( $saleRec, "Sales $sales not an integer format" );
    }

}

sub _validateSalesRevenue {
    my ( $self, $saleRec ) = @_;

    my $salesRevenue = $saleRec->salesRevenue;

    if ( !defined $salesRevenue ) {
        die Import::ValidationError->new( $saleRec, "Sales revenue not defined" );
    }

    if ( $salesRevenue !~ /^-?(?:(?:\d+)?\.\d+|\d+(?:\.)?(?:\d+)?)$/ ) {
        die Import::ValidationError->new( $saleRec, "Sales revenue $salesRevenue is in an incorrect format" );
    }
}

#sub _validateReturns { }
#sub _validateReturnsRevenue { }
#sub _validateTotalRevenue { }

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