package RPS::Import::E1Distribution::v4;

use strict;
use warnings;

use Date::Calc qw(Days_in_Month);

use lib '/app/tools/rps/lib';
use base 'RPS::Import::Importer';

sub _fieldMap {
    {
        labelName       => 'A8',
        dateBegin       => 'B1',
        dateEnd         => 'B1',
        productType     => 'A',  # A,B
        clientProductID => 'A',  # A,B
        artistName      => 'E',  # E,F
        upc             => 'C',  # C,D
        albumName       => 'E',  # E,F
        totalRevenue    => 'R',  # R,S
        mediaType       => 'A',  # A,B
    };
}

sub _unverifiedFieldMap {
    {
        _units => 'J',  # J,K
    };
}

sub _headerIdentifier { upc => 'UPC' }

sub physical          { 1 }
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_E1_DISTRIBUTION }

sub saleDates {
    my $self = shift;

    my ($startDate, $endDate) = $self->_getDateBegin() || '';

    if ( $startDate =~ /(\d{2})\/(\d{4})/ ) {
        $startDate = sprintf "%04d-%02d-%02d", $2, $1, 1;
        $endDate   = sprintf "%04d-%02d-%02d", $2, $1, Days_in_Month( $2, $1 );
    }

    return $self->_getDates( date_begin => $startDate, date_end => $endDate );
}

sub labelName {
    my $self = shift;

    my $labelName = $self->_getByFieldName('labelName') || '';
    $labelName = (split '\s+-\s+', $labelName)[-1];
    $labelName =~ s/^\s+|\s+$//g;

    return $labelName;
}

sub productType {
    my $self = shift;

    my $type = $self->_getByFieldName('productType') || '';
    $type = (split '-', $type)[1];

    return RPS::File::Sale::TYPE_CD  if $type =~ /^CD|SC$/i;
    return RPS::File::Sale::TYPE_DVD if $type =~ /^DV|DA$/i;
    return RPS::File::Sale::TYPE_LP  if $type =~ /^LP$/i;

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

sub mediaType {
    my $self = shift;

    my $type = $self->_getByFieldName('mediaType') || '';
    $type = (split '-', $type)[1];

    return RPS::DB::Item::MediaType::kMediaTypeAudio if $type =~ /^CD|SC|LP$/i;
    return RPS::DB::Item::MediaType::kMediaTypeVideo if $type =~ /^DV|DA$/i;

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

sub artistName {
    my $self = shift;

    my ($artistName, $albumName) = $self->_getArtistAlbumNames();
    return $albumName ? $artistName : '';
}

sub albumName {
    my $self = shift;

    my ($artistName, $albumName) = $self->_getArtistAlbumNames();
    return $albumName ? $albumName : $artistName;
}

sub _getArtistAlbumNames {
    my $self = shift;

    my $name = $self->_getByFieldName('artistName') || '';
    $name =~ s/^\s+|\s+$//g;
    my ($artistName, $albumName) = split '\s*[:;]\s*', $name;

    return $artistName, $albumName;
}

sub sales {
    my $self = shift;

    my $sales = $self->_getByFieldName('_units')              || 0;
    my $salesRevenue = $self->_getByFieldName('totalRevenue') || 0;
    return 1 if $sales == 0 && $salesRevenue < 0;

    return $sales > 0 ? $sales : 0;
}

sub salesRevenue {
    my $self = shift;

    my $salesRevenue = $self->_getByFieldName('totalRevenue') || 0;
    return $salesRevenue > 0 ? $salesRevenue : 0;
}

sub returns {
    my $self = shift;

    my $sales        = $self->_getByFieldName('_units')       || 0;
    my $salesRevenue = $self->_getByFieldName('totalRevenue') || 0;
    return 1 if $sales == 0 && $salesRevenue < 0;

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

sub returnsRevenue {
    my $self = shift;

    my $sales        = $self->_getByFieldName('_units')       || 0;
    my $salesRevenue = $self->_getByFieldName('totalRevenue') || 0;

    return $sales <= 0 && $salesRevenue < 0 ? abs($salesRevenue) : 0;
}

sub _isValidSaleRecord {
    my $self = shift;

    return ( $self->sales || $self->returns ) && ( $self->trackName || $self->albumName );
}

1;
