package RPS::Import::AtoNorth::v1;

use strict;
use warnings;

use Date::Calc qw(Decode_Month Days_in_Month);

use lib '/app/tools/rps/lib';
use RPS::Import::ServiceMap;

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


sub physical { 1 }

sub _fieldMap {
   my $self = shift;

   my %fieldMap = (
       1 => {
            labelName       => 'C',
            countryCode     => 'L',
            productType     => 'F',
            clientProductID => 'B',
            artistName      => 'D',
            upc             => 'J',
            albumName       => 'E',
            channel         => 'K',
            priceLevel      => 'M',
            wholesalePrice  => 'H',
            totalRevenue    => 'I',
            mediaType       => 'F',
       },
   );

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

sub _unverifiedFieldMap {
   {
       _netUnits => 'G',
   };
}

sub _headerIdentifier { productType => 'format' }


my %typesMapping = (
    '10"' => {
        product_type => RPS::File::Sale::TYPE_LP,
        media_type => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    '12"ep' => {
        product_type => RPS::File::Sale::TYPE_LP,
        media_type => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    '2xcd' => {
        product_type => RPS::File::Sale::TYPE_DBL_CD,
        media_type => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    '2xlp' => {
        product_type => RPS::File::Sale::TYPE_LP,
        media_type => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    '2xlp + 7"' => {
        product_type => RPS::File::Sale::TYPE_LP,
        media_type => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    '3xcd' => {
        product_type => RPS::File::Sale::TYPE_CD,
        media_type => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    '3xlp' => {
        product_type => RPS::File::Sale::TYPE_LP,
        media_type => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    '4xlp' => {
        product_type => RPS::File::Sale::TYPE_LP,
        media_type => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    '5xlp' => {
        product_type => RPS::File::Sale::TYPE_LP,
        media_type => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    '7"' => {
        product_type => RPS::File::Sale::TYPE_LP5,
        media_type => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'cd' => {
        product_type => RPS::File::Sale::TYPE_CD,
        media_type => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'cdep' => {
        product_type => RPS::File::Sale::TYPE_CD,
        media_type => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'lp' => {
        product_type => RPS::File::Sale::TYPE_LP,
        media_type => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'vinyl' => {
        product_type => RPS::File::Sale::TYPE_LP,
        media_type => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    '6xcd' => {
        product_type => RPS::File::Sale::TYPE_CD,
        media_type => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'cass' => {
        product_type => RPS::File::Sale::TYPE_CASS,
        media_type => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'cas5' => {
        product_type => RPS::File::Sale::TYPE_CAS_SIN,
        media_type => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
);

sub currencyCode { 'USD' }

sub countryCode {
    my $self = shift;

    my $country = $self->_getByFieldName('countryCode') || '';

    my $oCountry = Common::Country->new( search => $country );
    return $oCountry->alpha2 if $oCountry;

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

sub saleDates {
    my $self = shift;

    if ( $self->{_date_begin} && $self->{_date_end} ) {
        return $self->{_date_begin}, $self->{_date_end};
    }

    if ( $self->filename =~ /(\d{4}[-]\d{2}[-]\d{2})T\d{2}_\d{2}_\d{2}\.\d{3}Z.(\d{4}[-]\d{2}[-]\d{2})/ ) {
        $self->{_date_begin} = $1;
        $self->{_date_end} = $2;
        return $self->{_date_begin}, $self->{_date_end};
    }

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

sub productType {
    my $self = shift;

    my $type = lc( $self->_getByFieldName('productType') || '' );
    return $typesMapping{$type}->{product_type} if exists $typesMapping{$type};

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

sub channel {
    my $self = shift;

    my $channel = $self->_getByFieldName('channel') || '';
    return RPS::File::Sale::CHANNEL_RETAIL    if $channel =~ /^Retail$/i;
    return RPS::File::Sale::CHANNEL_MILITARY  if $channel =~ /^Military$/i;
    return RPS::File::Sale::CHANNEL_CLUB      if $channel =~ /^club$/i;
    return RPS::File::Sale::CHANNEL_MAILORDER if $channel =~ /^Mail Order$/i;
    return RPS::File::Sale::CHANNEL_DIRECT    if $channel =~ /^direct$/i;

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

sub priceLevel {
    my $self = shift;

    my $level = $self->_getByFieldName('priceLevel') || '';
    return RPS::File::Sale::PLEVEL_FULL    if $level =~ /^full$/i;
    return RPS::File::Sale::PLEVEL_MID     if $level =~ /^Mid$/i;
    return RPS::File::Sale::PLEVEL_BUDGET  if $level =~ /^Budget$/i;
    return RPS::File::Sale::PLEVEL_PROMO   if $level =~ /^Promo$/i;
    return RPS::File::Sale::PLEVEL_UNKNOWN if $level =~ /^Unknown$/i;

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

sub mediaType {
    my $self = shift;

    my $type = lc( $self->_getByFieldName('mediaType') || '' );
    return $typesMapping{$type}->{media_type} if exists $typesMapping{$type};

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

sub upc {
    my $self = shift;

    my $upc = $self->_getByFieldName('upc') || 0;
    return $upc =~ /E[+-]/i ? $upc + 0 : $upc;
}

sub clientProductID {
    my $self = shift;

    my $id = $self->_getByFieldName('clientProductID') || 0;
    return $id =~ /E[+-]/i ? $id + 0 : $id;
}

# physical
sub totalRevenue   { sprintf("%.8f", $_[0]->_getByFieldName('totalRevenue') || 0) }
sub netUnits       { $_[0]->_getByFieldName('_netUnits') || 0 }
sub sales          { $_[0]->netUnits     > 0 ? $_[0]->netUnits         : 0 }
sub salesRevenue   { $_[0]->totalRevenue > 0 ? $_[0]->totalRevenue     : 0 }
sub returns        { $_[0]->netUnits     < 0 ? abs $_[0]->netUnits     : 0 }
sub returnsRevenue { $_[0]->totalRevenue < 0 ? abs $_[0]->totalRevenue : 0 }

sub _isValidSaleRecord {
    return ( $_[0]->_getByFieldName('trackName') || $_[0]->_getByFieldName('artistName') )
}


1;
