package RPS::Import::Revolver::v4;

use strict;
use warnings;

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

use Date::Calc qw(Days_in_Month);

sub physical { 2 }

sub _fieldMapExtended {
    {
        physical => {
            option1 => {
                productType     => 'B',
                clientProductID => 'A',
                artistName      => 'C',
                albumName       => 'D',
                sales           => 'E',
                retailPrice     => 'I',
                totalRevenue    => 'J',
                mediaType       => 'B',
            },
         },
    };
}

sub _unverifiedFieldMapExtended {
    {
        physical => {
            option1 => {
                _returnsDefective => 'F',
                _returnsOverStock => 'G',
                _netUnits         => 'H',
            }
        }
    }
};

sub _headerIdentifierExtended {
    {
        physical => {
            option1 => {
                productType => 'Format',
            },
        },
    };
}

sub countryCode  { 'US' }
sub currencyCode { 'USD' }
sub channel      { RPS::File::Sale::CHANNEL_RETAIL }
sub priceLevel   { RPS::File::Sale::PLEVEL_UNKNOWN }
sub serviceID    { Client::Service::DSP_REVOLVER }
sub mediaType    { RPS::DB::Item::MediaType::kMediaTypeAudio }

sub saleDates {
    my $self = shift;

    my ($month, $year) = $self->filename =~ /(\d+)-(\d+)\.xls/;
    my $startDate;
    my $endDate;

    if ( $month && $year ) {
        $startDate = sprintf( "20%02d-%02d-%02d", $year, $month, 1 );
        $endDate = sprintf( "20%02d-%02d-%02d", $year, $month, Days_in_Month( $year, $month ) );
    }

    return ( $startDate, $endDate );
}

sub productType {
    my $self = shift;

    my $type = $self->_getByFieldName('productType') || '';
    if ( $type =~ /^(?:CD|[37]xCD)$/i ) {
        return RPS::File::Sale::TYPE_CD;
    } elsif ( $type =~ /^(?:LP|7"|12"|[23]xLP)$/i ) {
        return RPS::File::Sale::TYPE_LP;
    } elsif ( $type =~ /^MC$/i ) {
        return RPS::File::Sale::TYPE_CASS;
    }

    $self->fail("Unknown product type '$type'");
}

sub artistName {
    my $self = shift;

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

    if ($artist =~ /^(.+?), (.+?)$/) {
        $artist = "$2 $1";
    }

    return $artist;
}

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

sub returns {
    my $self = shift;

    my $defective = abs( $self->_getByFieldName('_returnsDefective') || 0 );
    my $overstock = abs( $self->_getByFieldName('_returnsOverStock') || 0 );
    return $defective + $overstock;
}

sub _isValidSaleRecord {
    return ( $_[0]->_getByFieldName('artistName') || $_[0]->_getByFieldName('albumName') )
}


1;
