package RPS::Import::Napalm::v2;

use strict;
use warnings;

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

use parent 'RPS::Import::Napalm::v1';
sub physical { 1 }

sub _fieldMap {
    {
        countryCode     => 'L',
        productType     => 'G',
        clientProductID => 'H',
        artistName      => 'E',
        upc             => 'M',
        albumName       => 'F',
        totalRevenue    => 'K',
        mediaType       => 'G',
    }
}
sub _unverifiedFieldMap {
    {
        _netUnits => 'J',
        _altUPC   => 'N',
    }
}

sub _headerIdentifier { artistName => 'Interpret' }

sub currencyCode { 'EUR' }
sub serviceID    { Client::Service::DSP_NAPALM }
sub channel      { RPS::File::Sale::CHANNEL_RETAIL }
sub priceLevel   { RPS::File::Sale::PLEVEL_UNKNOWN }

my %typesMap = (
    '2lp' => {
        product_type => RPS::File::Sale::TYPE_LP,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    '3lp' => {
        product_type => RPS::File::Sale::TYPE_LP,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'bluray' => {
        product_type => RPS::File::Sale::TYPE_DVD,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeVideo,
    },
    'cas5' => {
        product_type => RPS::File::Sale::TYPE_CAS_SIN,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'cd' => {
        product_type => RPS::File::Sale::TYPE_CD,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'dvd' => {
        product_type => RPS::File::Sale::TYPE_DVD,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeVideo,
    },
    'ep' => {
        product_type => RPS::File::Sale::TYPE_CD,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'lp' => {
        product_type => RPS::File::Sale::TYPE_LP,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'mc' => {
        product_type => RPS::File::Sale::TYPE_CASS,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'box' => {
        product_type => RPS::File::Sale::TYPE_CD,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'box-l' => {
        product_type => RPS::File::Sale::TYPE_CD,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'box-m' => {
        product_type => RPS::File::Sale::TYPE_CD,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'box-xl' => {
        product_type => RPS::File::Sale::TYPE_CD,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'earbook' => {
        product_type => RPS::File::Sale::TYPE_CD,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'mb' => {
        product_type => RPS::File::Sale::TYPE_CD,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'se' => {
        product_type => RPS::File::Sale::TYPE_CD,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
);

sub productType {
    my $self = shift;

    my $file = $self->filename;
    return RPS::File::Sale::TYPE_CAS_SIN if ($file =~ /merch/i);

    my $type = $self->_getByFieldName('productType') || '';
    if ( exists $typesMap{ lc $type } ) {
        return $typesMap{ lc $type }{product_type}
    }

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

sub upc {
    my $self = shift;

    my $upc    = $self->_getByFieldName('upc')     || '';
    my $altUpc = $self->_getByFieldName('_altUPC') || '';
    return $upc || $altUpc;
}

sub mediaType {
    my $self = shift;

    my $file = $self->filename;
    return RPS::DB::Item::MediaType::kMediaTypeAudio if ($file =~ /merch/i);

    my $type = $self->_getByFieldName('mediaType') || '';
    if ( exists $typesMap{ lc $type } ) {
        return $typesMap{ lc $type }{media_type}
    }

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

# physical
sub netUnits {
    my $self = shift;

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

    $netUnits = abs($netUnits)      if $revenue > 0;
    $netUnits = abs($netUnits) * -1 if $revenue < 0;

    return $netUnits;
}

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 }
sub totalRevenue   { $_[0]->_getByFieldName('totalRevenue') || 0 }

sub _isValidSaleRecord {
    my $self = shift;

    my $totalRevenue = $self->_getByFieldName('totalRevenue') || 0;
    my $artistName   = $self->_getByFieldName('artistName')   || '';
    my $albumName    = $self->_getByFieldName('albumName')    || '';

    return 0 if (!$totalRevenue || $totalRevenue =~ /^0.0+/);
    return ($artistName || $albumName);
}

1;
