package RPS::Import::E1Distribution::v5;

use strict;
use warnings;

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


sub _fieldMap {
    my $self = shift;

    my %fieldMap = (
        5 => {
            serviceID   => 'M',
            countryCode => 'D',
            dateBegin   => 'A',
            dateEnd     => 'A',
            productType => 'J',
            formatType  => 'N',
            artistName  => 'I',
            upc         => 'F',
            albumName   => 'H',
            isrc        => 'G',
            trackNum    => 'L',
            trackName   => 'H',
            units       => 'O',
            price       => 'P',
            mediaType   => 'N',
        },
    );

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

sub _headerIdentifier { upc => 'UPC' }

sub currencyCode { 'USD' }
sub mediaType    { RPS::DB::Item::MediaType::kMediaTypeAudio }

sub serviceID {
    my $self = shift;

    my $service = lc( $self->_getByFieldName('serviceID') || '' );
    my $serviceID = $self->getServiceID($service) || $RPS::Import::ServiceMap::SERVICE_ALIASES{$service};

    return $serviceID if $serviceID;
    $self->fail("Unable to determine service from: $service");
}

sub saleDates {
    my $self = shift;

   # YYYY/MM
    my $date = $self->_getByFieldName('dateBegin') || '';
    if ( my ($y, $m) = $date =~ /(\d{4})\/(\d{2})/i ) {
        return $self->_getDates( date_begin => sprintf( "%04d-%02d-%02d", $y, $m, 1 ) );
    }

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

sub countryCode {
    my $self = shift;

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

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

sub productType {
    my $self = shift;

    my $type = $self->_getByFieldName('productType') || '';
    return RPS::File::Sale::TYPE_TRACK if $type =~ /^T$/i;
    return RPS::File::Sale::TYPE_ALBUM if $type =~ /^A$/i;

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

sub formatType {
    my $self = shift;

    my $type = $self->_getByFieldName('formatType') || '';
    return RPS::File::Sale::FORMAT_DOWNLOAD    if $type =~ /^(?:DownLoad|High Quality Playlist\/Album|High Quality Song|)$/i;
    return RPS::File::Sale::FORMAT_STREAM      if $type =~ /^(?:Audio\/Video Stream|Stream|Stream Cloud)$/i;
    return RPS::File::Sale::FORMAT_PERFORMANCE if $type =~ /^(?:Performance)$/i;
    return RPS::File::Sale::FORMAT_TETHERED    if $type =~ /^(?:Teth Download)$/i;

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

sub albumName {
    my $self = shift;

    my $name = $self->_getByFieldName('albumName') || '';
    return $name if $self->productType eq RPS::File::Sale::TYPE_ALBUM;
}

sub trackName {
    my $self = shift;

    my $name = $self->_getByFieldName('trackName') || '';
    return $name if $self->productType eq RPS::File::Sale::TYPE_TRACK;
}

sub price     { abs( shift->_getByFieldName('price') || 0 ) }
sub unitPrice { abs shift->SUPER::unitPrice }
sub units {
    my $self = shift;
    my $units = $self->_getByFieldName('units') || 0;
    my $price = $self->_getByFieldName('price') || 0;

    if ( $price > 0 ) {
        $units = $units ? abs($units) : 1;
    } elsif ( $price < 0 ) {
       $units = $units ? -1 * abs($units) : -1;
    }

    return $units;
}

sub _isValidSaleRecord {
    return defined $_[0]->price && ( $_[0]->trackName || $_[0]->albumName );
}


1;
