package RPS::Import::Universal::v62;

use strict;
use warnings;

use lib '/app/tools/rps/lib';
use Date::Calc qw(Days_in_Month Add_Delta_Days Decode_Month);

use parent 'RPS::Import::Importer';

sub physical { 1 }

sub _fieldMap {
    my $self = shift;

    my %field_map = (
        62 => {
            labelName       => 'K',
            productType     => 'AD',
            artistName      => 'M',
            clientProductID => 'O',
            upc             => 'P',
            albumName       => 'N',
            priceLevel      => 'AH',
            wholesaleRate   => 'AK',
            totalRevenue    => 'AN',
        },
    );

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

sub _unverifiedFieldMap {
    my $self = shift;

    my %field_map = (
        62 => {
            _netUnits => 'AO',
        },
    );

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

sub _headerIdentifier { upc => qr/UPC( ID)?/ }

sub countryCode  { 'US' }
sub currencyCode { 'USD' }
sub channel      { RPS::File::Sale::CHANNEL_RETAIL }

sub saleDates {
    my $self = shift;

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

    my $fileName = $self->filename() || '';
    if ( my ($month, $year) = $fileName =~ /_Glassnote_(\d{2})(\d{2})/ ) {
        $self->{_startDate} = sprintf "%04d-%02d-%02d", "20$year", $month, 1;
        $self->{_endDate}   = sprintf "%04d-%02d-%02d", "20$year", $month, Days_in_Month("20$year", $month);
        return $self->{_startDate}, $self->{_endDate};
    }

    $self->fail("Unable to determine date begin from the file name.");
}

sub productType {
    my $self = shift;

    my $type = $self->_getByFieldName('productType') || '';
    return RPS::File::Sale::TYPE_BLURAY     if $type =~ /^bd$/i;
    return RPS::File::Sale::TYPE_CD         if $type =~ /^cd$/i;
    return RPS::File::Sale::TYPE_DVD        if $type =~ /^dv$/i;
    return RPS::File::Sale::TYPE_DVD_CD_SET if $type =~ /^dx$/i;
    return RPS::File::Sale::TYPE_LP         if $type =~ /^lp$/i;
    return RPS::File::Sale::TYPE_CD_SIN     if $type =~ /^s5$/i;
    return RPS::File::Sale::TYPE_CASS       if $type =~ /^ct$/i;
    return RPS::File::Sale::TYPE_LP5        if $type =~ /^s$/i;

    $self->fail("Could not parse product type from '$type'");
}

sub priceLevel {
    my $self  = shift;

    my $level = $self->_getByFieldName('priceLevel') || '';
    return RPS::File::Sale::PLEVEL_FULL    if $level =~ /^f$/i;
    return RPS::File::Sale::PLEVEL_MID     if $level =~ /^m$/i;
    return RPS::File::Sale::PLEVEL_BUDGET  if $level =~ /^b$/i;
    return RPS::File::Sale::PLEVEL_UNKNOWN if $level =~ /^s$/i;

    $self->fail("Could not parse price level from '$level'");
}

sub upc {
    my $self = shift;

    my $upc  = $self->_getByFieldName('upc') || '';
    return Common::Util::normalize_upc($upc);
}

sub artistName {
    my $self = shift;

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

sub netUnits       { $_[0]->_getByFieldName('_netUnits')    || 0 }
sub totalRevenue   { $_[0]->_getByFieldName('totalRevenue') || 0 }
sub sales          { $_[0]->totalRevenue >= 0 ? abs $_[0]->netUnits     : 0 }
sub salesRevenue   { $_[0]->totalRevenue > 0  ? $_[0]->totalRevenue     : 0 }
sub returns        { $_[0]->totalRevenue < 0  ? abs $_[0]->netUnits     : 0 }
sub returnsRevenue { $_[0]->totalRevenue < 0  ? abs $_[0]->totalRevenue : 0 }

sub _isValidSaleRecord {
    my $self = shift;

    if ( $self->totalRevenue > 0 && $self->netUnits < 0 ) {
        $self->fail("Posisitve revenue with negative units.");
    } elsif ( $self->totalRevenue < 0 && $self->netUnits > 0 ) {
        $self->fail("Negative revenue with positive units.");
    }

    return ( $self->_getByFieldName('albumName') || $self->_getByFieldName('artistName') )
        && ( $self->_getByFieldName('_netUnits') || $self->_getByFieldName('totalRevenue') );
}


1;