package RPS::Import::Caroline::v23;

use strict;
use warnings;

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

sub _fieldMap {
    my $self = shift;

    my %fieldMap = (
        23 => {
            labelName      => 'C',
            countryCode    => 'R16',
            dateBegin      => 'B',
            dateEnd        => 'B',
            productType    => 'J',    # configuration
            artistName     => 'E',
            upc            => 'F',
            albumName      => 'G',
            currencyCode   => 'R16',
            sales          => 'S',
            returns        => 'T',
            units          => 'U',
            totalRevenue   => 'R',
        },
    );

    return $fieldMap{ $self->_version };
}

sub _unverifiedFieldMap {
    my $self = shift;

    my %fieldMap = (
        23 => {
            grossIncome         => 'K',
            discountsOffInvoice => 'M',
            discountsOnInvoce   => 'N',
            grossReturns        => 'P',
            discountsOnReturns  => 'Q',
        },
    );

    return $fieldMap{ $self->_version };
}

sub physical          { 1 }
sub currencyCode      { 'CAD' }
sub serviceID         { Client::Service::DSP_CAROLINE }
sub channel           { RPS::File::Sale::CHANNEL_RETAIL }
sub priceLevel        { RPS::File::Sale::PLEVEL_UNKNOWN }
sub _headerIdentifier { productType => 'Product Type' }

sub countryCode {
    my $self = shift;

    my %mapFromCurrency = (
        cad => 'ca',
        usd => 'us',
    );

    my $ccode  = lc ($self->_getByFieldName('currencyCode') || '');
    my $oCountry = Common::Country->new( search => $mapFromCurrency{$ccode} );
    return $oCountry->alpha2() if $oCountry;

    $self->fail("Unable to determine country code from '$ccode'");
}

sub saleDates {
    my $self = shift;

    my $startDate = $self->_getDateBegin();
    my $endDate   = $self->_getDateEnd();

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

sub productType {
    my $self = shift;

    my $type = $self->_getByFieldName('productType') || '';

    if ( $type =~ /^blu-ray disc$/i ) {
        return RPS::File::Sale::TYPE_BLURAY;
    }
    elsif ( $type =~ /^cd album$/i ) {
        return RPS::File::Sale::TYPE_CD;
    }
    elsif ( $type =~ /^cd album plus dvd video$/i ) {
        return RPS::File::Sale::TYPE_DVD_CD_SET;
    }
    elsif ( $type =~ /^cd maxisingle$/i ) {
        return RPS::File::Sale::TYPE_CD_SIN;
    }
    elsif ( $type =~ /^dvd video album ntsc$/i ) {
        return RPS::File::Sale::TYPE_DVD;
    }
    elsif ( $type =~ /^vinyl album 1[02]" (?:33|45) rpm$/i ) {
        return RPS::File::Sale::TYPE_LP;
    }
    elsif ( $type =~ /^vinyl (:?maxi)?single (?:7|12)" (?:33|45) rpm$/i ) {
        return RPS::File::Sale::TYPE_LP5;
    }

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

sub _processSheet {
    my ($self, $sheet, $sheetnum) = @_;
    return unless $self->{sheetname} =~ /^Physical$/i;

    return $self->RPS::Import::Importer::_processSheet( $sheet, $sheetnum );
}

sub sales {
    my $self = shift;

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

sub salesRevenue {
    my $self = shift;

    my $grossIncome = $self->_getByFieldName('grossIncome') || 0;
    # don't calculate the revenue  if the gross amount is empty
    return 0 unless $grossIncome;

    my $sales        = $self->_getByFieldName('sales') || 0;
    my $salesRevenue = $grossIncome + $self->_salesDiscount;

    return $sales > 0 && $salesRevenue >= 0 ? $salesRevenue : 0;
}

sub returns {
    my $self = shift;

    my $returns = $self->_getByFieldName('returns') || 0;
    return $returns < 0 ? abs($returns) : 0;
}

sub returnsRevenue {
    my $self = shift;

    my $returns            = $self->_getByFieldName('returns')            || 0;
    my $grossReturns       = $self->_getByFieldName('grossReturns')       || 0;
    my $discountsOnReturns = $self->_getByFieldName('discountsOnReturns') || 0;
    my $returnsRevenue = $grossReturns + $discountsOnReturns;

    # add sales discounts if the sales amount is empty
    $returnsRevenue += $self->_salesDiscount unless $self->salesRevenue;

    return $returns < 0 && $returnsRevenue < 0 ? abs($returnsRevenue) : 0;
}

sub _isValidSaleRecord {
    my $self = shift;

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

sub _salesDiscount {
    my $self = shift;

    my $discountsOffInvoice = $self->_getByFieldName('discountsOffInvoice') || 0;
    my $discountsOnInvoce   = $self->_getByFieldName('discountsOnInvoce')   || 0;

    return $discountsOffInvoice + $discountsOnInvoce;
}


1;
