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.
###
