package RPS::Import::MVD::v9;

use strict;
use warnings;

use parent qw/RPS::Import::MapFaceBase RPS::Import::Importer/;

sub _fieldMap {
    {
        labelName        => 'A',
        countryCode      => 'C',
        serviceID        => 'B',
        dateBegin        => 'D',
        dateEnd          => 'E',
        productType      => 'F',
        formatType       => 'G',
        clientProductID  => 'H',
        upc              => 'I',
        albumName        => 'J',
        isrc             => 'L',
        trackNum         => 'N',
        trackName        => 'O',
        units            => 'Q',
        currencyCode     => 'T',
        price            => 'W',
    }
}

sub _unverifiedFieldMap {
    {
        _albumArtist => 'K',
        _trackArtist => 'P',
    }
}

sub _headerIdentifier { ( dateBegin => qr/DATE|period.start/ ) }

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;

    return $self->handleError( "Unknown service: $service", RPS::DB::Item::SaleImportError::kErrorService );
}

sub productType {
    my $self = shift;

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

    $self->handleError( "Unknown product type: '$type'", RPS::DB::Item::SaleImportError::kErrorProductType );
}

sub formatType {
    my $self = shift;

    my $serviceID = $self->_getByFieldName('serviceID')  || '';
    my $fmt       = $self->_getByFieldName('formatType') || '';

    return RPS::File::Sale::FORMAT_PERFORMANCE if ($serviceID =~ /^SoundExchange$/i);
    return RPS::File::Sale::FORMAT_STREAM if ($fmt =~ /^S(?:TREAM)?$/i);
    return RPS::File::Sale::FORMAT_DOWNLOAD if ($fmt =~ /^D(?:OWNLOAD)?$/i);

    return $self->handleError( "Unknown format: $fmt", RPS::DB::Item::SaleImportError::kErrorFormatType );
}

sub artistName {
    my $self = shift;

    my $albumArtist = $self->_getByFieldName('_albumArtist') || "";
    my $trackArtist = $self->_getByFieldName('_trackArtist') || "";

    return ($self->productType eq RPS::File::Sale::TYPE_ALBUM) ? $albumArtist : $trackArtist;
}

sub saleDates {
    my $self = shift;

    my $date_begin = $self->_getByFieldName('dateBegin') || "";
    my $date_end = $self->_getByFieldName('dateEnd') || "";

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

sub units {
    my $self = shift;

    my $units = $self->_getByFieldName('units') || 0;
    my $price = $self->_getByFieldName('price') || 0;
    return $price < 0 ? abs($units) * -1 : $units;
}

sub countryCode {
    my $self = shift;

    my $name = $self->_getByFieldName('countryCode') || 'US';
	my $country = Common::Country->Get($name);

    return $country->alpha2() if $country;

	$self->handleError( "Unknown country: '$name'.", RPS::DB::Item::SaleImportError::kErrorCountry );
    return $name;
}

sub _mapFaceServiceID   { 'serviceID' }
sub _mapFaceCountryCode { 'countryCode' }
sub _mapFaceProductType { 'productType' }
sub _mapFaceFormatType  { 'formatType' }
sub _mapFaceMediaType   { 'mediaType' }

1;
