package RPS::Import::V2Benelux::v2;

use strict;
use warnings;

use Date::Calc qw(Days_in_Month);

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

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

sub _fieldMap {
    {
        labelName       => 'F',
        productType     => 'C',
        clientProductID => 'E',
        artistName      => 'A',
        upc             => 'D',
        albumName       => 'B',
        mediaType       => 'C',
        totalRevenue    => 'H',
    };
}

sub _unverifiedFieldMap {
    {
        salesDate => 'B3',
        distFee   => 'B10',
        netUnits  => 'G',
    };
}

sub _headerIdentifier { albumName => 'Title' }

sub physical      { 1 }
sub currencyCode  { 'EUR' }
sub channel       { RPS::File::Sale::CHANNEL_RETAIL }
sub priceLevel    { RPS::File::Sale::PLEVEL_UNKNOWN }

sub productType {
    my $self = shift;

    my $type = lc( $self->_getByFieldName('productType') || '' );
    return RPS::File::Sale::TYPE_CD     if $type =~ /^cd$/i;
    return RPS::File::Sale::TYPE_DBL_CD if $type =~ /^2cd$/i;

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

sub artistName {
    my $self = shift;

    my $name = $self->_getByFieldName('artistName') || '';
    return $name =~ /(\w+)\s*,\s*(\w+)/ ? "$2 $1" : $name;
}

sub mediaType {
    my $self = shift;

    my $type = lc( $self->_getByFieldName('mediaType') || '' );
    if ( $type =~ /^2?cd$/i ) {
        return RPS::DB::Item::MediaType::kMediaTypeAudio;
    }

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

sub countryCode {
    my $self = shift;
    # from header of current sheet; see _processSheet
    return $self->{_countryCode} if $self->{_countryCode};
}

sub saleDates {
    my $self = shift;
    # from the Summary sheet; see _preProcess
    return ($self->{_startDate}, $self->{_endDate}) if $self->{_startDate};
}

sub sales {
    my $self = shift;

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

sub salesRevenue {
    my $self = shift;

    my $revenue = $self->_applyDistFee();
    return $revenue > 0 ? $revenue : 0;
}

sub returns {
    my $self = shift;

    my $sales   = $self->_getByFieldName('netUnits')     || 0;
    my $revenue = $self->_getByFieldName('totalRevenue') || 0;
    return $sales < 0 && $revenue < 0 ? abs($sales) : 0;
}

sub returnsRevenue {
    my $self = shift;

    my $sales   = $self->_getByFieldName('netUnits') || 0;
    my $revenue = $self->_applyDistFee();
    return $sales < 0 && $revenue < 0 ? abs($revenue) : 0;
}

sub totalRevenue {
    return shift->_applyDistFee();
}

sub _isValidSaleRecord {
    my $self = shift;
    return ( $self->sales || $self->returns ) && $self->albumName;
}

sub _processSheet {
    my ($self, $sheet, $sheetnum) = @_;

    if ( $self->{sheetname} !~ /^summary$/ ) {
        $self->_determineCountryCode();
        return $self->SUPER::_processSheet( $sheet, $sheetnum );
    }
}

sub _preProcess {
    my ( $self, %args ) = @_;

    $self->SUPER::_preProcess(%args);

    # Get the distribution fee and sales dates from the summary tab
    my $aSheets     = $args{sheets};
    my $aSheetNames = $args{sheet_names};

    my $i = 0;
    foreach my $aSheet ( @$aSheets ) {
        my $sheetName = $aSheetNames->[$i];
        next unless $sheetName =~ /^summary$/i;

        foreach my $line ( @$aSheet ) {
            $self->{line} = $line;
            if ( $self->_determineDistFee && $self->_determineSalesDates ) {
                return 1;
            }
        }
    }

    return;
}

sub _determineCountryCode {
    my $self = shift;

    my %countryCodeMap = (
        nl => 'Netherlands',
        be => 'Belgium',
    );

    ( my $ccode = $self->{sheetname} ) =~ s/.*(\w{2})$/\L$1/;

    my $oCountry = Common::Country->Get( $countryCodeMap{$ccode} ) if exists $countryCodeMap{$ccode};
    $self->{_countryCode} = $oCountry ? $oCountry->alpha2() : $ccode;

    return 1;
}

sub _determineDistFee {
    my $self = shift;

    my $distFeeField = $self->_getByFieldName('distFee') || 0;
    if ( $distFeeField =~ /Distribution fee (\d{1,2})%/i ) {
        return $self->{_distFee} = $1;
    }

    return;
}

sub _applyDistFee {
    my $self = shift;

    my $distFee = $self->{_distFee};
    my $revenue = $self->_getByFieldName('totalRevenue') || 0;
    $self->fail("Unable to determine distribution fee") unless $distFee;

    $distFee = ( 100 - $distFee ) * .01;
    return $revenue *= $distFee;
}

sub _determineSalesDates {
    my $self = shift;

    my $salesDate = $self->_getByFieldName('salesDate') || '';
    if ( $salesDate =~ /(\d{4})-(\d{1,2})-(\d{1,2})/ ) {    # YYYY-MM-DD
        $self->{_startDate} = sprintf( "%04d-%02d-%02d", $1, $2, 1 );
        $self->{_endDate}   = sprintf( "%04d-%02d-%02d", $1, $2, Days_in_Month( $1, $2 ) );
        return 1;
    }

    return;
}

1;
