package RPS::Import::Alliance::v4;

use strict;

use lib '/app/tools/rps/lib';

use base 'RPS::Import::Alliance::v1';

sub _fieldMap {
    my $self = shift;

    my %map = (
        4 => {
            # detail section of each sheet
            #
            labelName       => 'B',
            artistName      => 'P',
            clientProductID => 'N',
            wholesalePrice  => 'R',
            upc             => 'O',
            albumName       => 'P',
            countryCode     => 'AA',
            dateBegin       => 'E',

            # Top section only (returns)
            #
            returns        => 'Q',
            returnsRevenue => 'U',

            # Bottom section only (sales)
            #
            sales        => 'Q',
            salesRevenue => 'V',
        },
        5 => {
            labelName       => 'B',
            countryCode     => 'Z',
            dateBegin       => 'D',
            dateEnd         => 'D',
            productType     => 'J',
            clientProductID => 'J',
            artistName      => 'L',
            upc             => 'K',
            albumName       => 'M',
            wholesalePrice  => 'O',
            sales           => 'N',
            returns         => 'N',
            totalRevenue    => 'T',
            returnsRevenue  => 'T',
            salesRevenue    => 'T',
        },
    );

    return $map{ $self->_version };
}

use constant kReturnsSection => 1;
use constant kSalesSection   => 2;

sub priceLevel { RPS::File::Sale::PLEVEL_UNKNOWN }

sub albumName {
    my $self = shift;
    my $album = $self->_getByFieldName('albumName');

    my $name = (split( "/", $album))[-1];
    $name =~ s/^\s*//;
    return $name;
}

sub artistName {
    my $self = shift;
    my $artist = $self->_getByFieldName('artistName');

    my $name = (split( "/", $artist))[0];
    $name =~ s/^\s*//;
    return $name;
}

sub productType {
    my $self   = shift;
    my $config = $self->_getByFieldName('clientProductID');

    if ( $config =~ /(\.2|SACD)$/i ) {
        return RPS::File::Sale::TYPE_CD;
    }
    elsif ( $config =~ /\.(1|7)$/i ) {
        return RPS::File::Sale::TYPE_LP;
    }
    elsif ( $config =~ /DVA|DVD$/i ) {
        return RPS::File::Sale::TYPE_DVD;
    }
    elsif ( $config =~ /\.4$/i ) {
        return RPS::File::Sale::TYPE_CASS;
    }

    $self->fail("Unable to determine config from product($config)");
}

sub countryCode {
    my $self = shift;

    my $country = $self->_getByFieldName('countryCode');
    return 'SA' if $country =~ /^NT$/i;

    return $self->SUPER::countryCode;
}

sub sales {
    my $self = shift;
    if ( $self->{_section} == kSalesSection ) {
        my $netRev = $self->_getByFieldName('salesRevenue');

        # handle returns in the sales section
        #
        return ( $netRev > 0 ) ? abs( $self->_getByFieldName('sales') ) : 0;
    }
    return 0;
}

sub salesRevenue {
    my $self = shift;
    if ( $self->{_section} == kSalesSection ) {
        my $netRev = $self->_getByFieldName('salesRevenue');

        # handle returns in the sales section
        #
        return ( $netRev > 0 ) ? $netRev : 0;
    }
    return 0;
}

sub returns {
    my $self = shift;

    my $netRev = $self->_getByFieldName('salesRevenue');

    if ( $self->{_section} == kReturnsSection ) {
        # RSD-6922. Erroring out if no separate section found for returns.
        $self->fail("Found 'returns' in the 'sales' section. Line: ".$self->linenum.". Returns should be placed in separate section") if ($netRev > 0);

        # a return is assumed to be a return...
        #
        return abs( $self->_getByFieldName('returns') );

    } else {
        # ... however a sale may also be a return
        #
        my $sales        = $self->_getByFieldName('sales');

        return ( $netRev < 0 ) ? abs($sales) : 0;
    }
}

sub returnsRevenue {
    my $self = shift;
    if ( $self->{_section} == kReturnsSection ) {

        # a return is assumed to be a return...
        #
        return abs( $self->_getByFieldName('returnsRevenue') );
    } else {

        # ... however a sale may also be a return
        #
        my $netRev = $self->_getByFieldName('salesRevenue');

        return ( $netRev < 0 ) ? abs($netRev) : 0;
    }
}

sub totalRevenue {
    my $self = shift;
    return $self->salesRevenue - $self->returnsRevenue;
}

1;
