package RPS::Import::PIAS::v13;

use strict;
use warnings;

use lib '/app/tools/common/lib';
use Date::Calc qw(Days_in_Month);

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

sub physical { 1 }

sub _fieldMap {
    {
        countryCode     => 'E',
        dateBegin       => 'D4',
        dateEnd         => 'D4',
        productType     => 'B',
        clientProductID => 'B',
        artistName      => 'D',
        albumName       => 'C',
        currencyCode    => 'D5',
        wholesalePrice  => 'J',
        sales           => 'H',
        returns         => 'I',
        free            => 'G',
        totalRevenue    => 'S',
    };
}

sub _headerIdentifier { albumName => 'TITLE' }

my %months = (
    jan => 1,
    feb => 2,
    mar => 3,
    apr => 4,
    may => 5,
    jun => 6,
    jul => 7,
    aug => 8,
    sep => 9,
    oct => 10,
    nov => 11,
    dec => 12,
);

sub channel    { RPS::File::Sale::CHANNEL_RETAIL }
sub priceLevel { RPS::File::Sale::PLEVEL_UNKNOWN }

sub countryCode {
    my $self = shift;

    my $name = $self->_getByFieldName('countryCode') || '';
    my $oCountry = Common::Country->Get($name);
    if ( my $country = $oCountry->alpha2 ) {
        return $country;
    }

    $self->fail( "Unable to determine country from: '$name'." );
}

sub saleDates {
    my $self = shift;

    if ( $self->{_startDate} ) {
        return $self->{_startDate}, $self->{_endDate};
    }

    my $date = $self->_getByFieldName('dateBegin') || '';
    $self->fail( "Could not determine period from '$date'" ) unless (
        $date =~ /([a-z]{3,9})[\s-](\d{4})/i
    );

    my ($year, $month) = ($2, $1);
    $year  =~ s/^\d*?(\d{2})$/20$1/;
    $month =~ s/^([a-z]{3}).*$/\L$1/i;

    $self->{_startDate} = sprintf "%04d-%02d-%02d", $year, $months{$month}, 1;
    $self->{_endDate}   = sprintf "%04d-%02d-%02d", $year, $months{$month}, Days_in_Month( $year, $months{$month} );

    return $self->{_startDate}, $self->{_endDate};
}

sub productType {
    my $self = shift;

    my $type = $self->_getByFieldName('productType') || '';
    return RPS::File::Sale::TYPE_LP  if $type =~ /(?:v|lp)$/i;
    return RPS::File::Sale::TYPE_DVD if $type =~ /dvd$/i;

    return RPS::File::Sale::TYPE_CD;
}

sub currencyCode {
    my $self = shift;

    return $self->{_currency_code} if $self->{_currency_code};

    my $code = $self->_getByFieldName('currencyCode') || '';
    $code =~ s/[^a-zA-Z]//g;
    if ( $self->{_currency_code} = $code ) {
        return $self->{_currency_code};
    }

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

sub sales {
    my $self = shift;

    return abs( $self->_getByFieldName('sales') || 0 );
}

sub salesRevenue {
    my $self = shift;

    return abs( $self->_getByFieldName('totalRevenue') || 0 ) if $self->sales;
}

sub returns {
    my $self = shift;

    return abs( $self->_getByFieldName('returns') || 0 );
}

sub returnsRevenue {
    my $self = shift;

    return abs( $self->_getByFieldName('totalRevenue') || 0 ) if $self->returns;
}

sub _isValidSaleRecord {
    my $self = shift;

    if ( $self->totalRevenue && !$self->sales && !$self->returns ) {
        $self->fail("Revenue without units");
    }

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


1;
