package RPS::Import::AccountEdge::v1;

use strict;
use warnings;

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

use lib '/app/tools/rps/lib';
use parent 'RPS::Import::ImporterMixed';

sub physical { 1 }

sub _fieldMapExtended {
    {
        physical => {
            option1 => {
                countryCode     => 'I',
                dateBegin       => 'B',
                dateEnd         => 'B',
                productType     => 'C',
                clientProductID => 'C',
                albumName       => 'E',
                wholesalePrice  => 'F',
                totalRevenue    => 'H',
                mediaType       => 'C',
            },
        },
    };
}

sub _unverifiedFieldMapExtended {
    {
        physical => {
            option1 => {
                _netUnits => 'D',
            },
        }
    };
}

sub _headerIdentifierExtended {
    {
        physical => {
            option1 => {
                countryCode => 'Territory',
            },
        },
    };
}

sub _isValidSaleRecord {
    my $self = shift;

    my $productType = $self->_getByFieldName('productType') || '';
    $self->fail("Wrong product type: '$productType'.") if $productType =~ /^.*(?:8|3|BOOK)$/i;

    return $self->_getByFieldName('dateBegin') && defined $self->totalRevenue;
}

sub currencyCode { 'USD' }
sub channel      { RPS::File::Sale::CHANNEL_RETAIL }
sub priceLevel   { RPS::File::Sale::PLEVEL_UNKNOWN }

sub countryCode {
    my $self = shift;

    my $name = $self->_getByFieldName('countryCode') || return;
    my $oCountry = Common::Country->Get($name);
    return $oCountry ? $oCountry->alpha2 : undef;
}

sub productType {
    my  $self = shift;

    my $type = $self->_getByFieldName('productType') || '';
    return RPS::File::Sale::TYPE_BLURAY if $type =~ /BR$/i;
    return RPS::File::Sale::TYPE_CD     if $type =~ /CD$/i;
    return RPS::File::Sale::TYPE_CASS   if $type =~ /CT$/i;
    return RPS::File::Sale::TYPE_DVD    if $type =~ /DVD$/i;
    return RPS::File::Sale::TYPE_LP5    if $type =~ /(?:VL2|SP)$/i;
    return RPS::File::Sale::TYPE_LP     if $type =~ /(?:LP|VL|LP2)$/i;

    $self->fail( "Unable to determine product_type from: '$type'." );
}

sub mediaType {
    my $self = shift;

    my $type = $self->_getByFieldName('mediaType') || '';
    return RPS::DB::Item::MediaType::kMediaTypeAudio if $type =~ /(?:LP|CD|CT|VL|VL2|SP|LP2)$/i;
    return RPS::DB::Item::MediaType::kMediaTypeVideo if $type =~ /(?:BR|DVD)$/i;

    $self->fail( "Unable to determine media_type from: '$type'." );
}

sub netUnits {
    my $self = shift;

    my $units   = $self->_getByFieldName('_netUnits') || 0;
    my $revenue = $self->totalRevenue;

    if ( $revenue > 0 ) {
        return abs $units;
    } elsif ( $revenue < 0 ) {
       return abs($units) * -1
    }

    return $units;
}

sub totalRevenue   { $_[0]->_getByFieldName('totalRevenue') || 0 }
sub sales          { $_[0]->netUnits     > 0 ? $_[0]->netUnits         : 0 }
sub salesRevenue   { $_[0]->totalRevenue > 0 ? $_[0]->totalRevenue     : 0 }
sub returns        { $_[0]->netUnits     < 0 ? abs $_[0]->netUnits     : 0 }
sub returnsRevenue { $_[0]->totalRevenue < 0 ? abs $_[0]->totalRevenue : 0 }


1;
