package RPS::Import::Revelation::v1;

use strict;
use warnings;

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

use Date::Calc qw(Add_Delta_Days Days_in_Month);

sub physical { 1 }

sub _fieldMapExtended {
    {
        physical => {
            option1 => {
                productType     => 'B',
                clientProductID => 'B',
                artistName      => 'C',
                albumName       => 'C',
                totalRevenue    => 'G',
                mediaType       => 'B',
            },
         },
    };
}
sub _unverifiedFieldMapExtended {
    {
        physical => {
            option1 => {
                _netUnits => 'E',
            }
        }
    }
};


sub _headerIdentifierExtended {
    {
        physical => {
            option1 => {
                artistName => 'Description',
            },
        },
    };
}

my %map = (
    '2' => {
        product_type => RPS::File::Sale::TYPE_CD,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    '1' => {
        product_type => RPS::File::Sale::TYPE_LP,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    '4' => {
        product_type => RPS::File::Sale::TYPE_CASS,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
);

sub channel      { RPS::File::Sale::CHANNEL_RETAIL }
sub serviceID    { Client::Service::DSP_REVELATION }
sub currencyCode { 'USD' }
sub countryCode  { 'US' }
sub priceLevel   { RPS::File::Sale::PLEVEL_UNKNOWN }

sub saleDates {
    my $self = shift;

    my ($month, $year) = $self->filename() =~ /(\d\d)-(\d\d).xlsx?$/;
    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) {
        $type =~ /-(.)$/;

        if ( exists $map{$1} ) {
            return $map{$1}{product_type};
        }
    }

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

sub mediaType {
    my $self = shift;

    my $type = $self->_getByFieldName('mediaType') || '';
    if ($type) {
        $type =~ /-(.)$/;
        if ( exists $map{$1} ) {
            return $map{$1}{media_type};
        }
    }

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

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

sub _isValidSaleRecord {
    return ($_[0]->_getByFieldName('productType') && $_[0]->_getByFieldName('artistName') && $_[0]->_getByFieldName('_netUnits'))
}


1;
