package RPS::Import::Caroline::v22;

use strict;
use warnings;

use lib '/app/tools/rps/lib';

use RPS::Import::ServiceMap;

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

sub _fieldMap {
    my $self = shift;

    my %fieldMap = (
        22 => {
            labelName    => 'B',
            serviceID    => 'G',
            countryCode  => 'H',
            dateBegin    => 'E',
            dateEnd      => 'F',
            productType  => 'N',
            formatType   => 'Q',
            artistName   => 'P',
            upc          => 'J',
            albumName    => 'K',
            isrc         => 'J',
            trackName    => 'K',
            units        => 'S',
            currencyCode => 'W',
            price        => 'W',
        },
        25 => {
            labelName    => 'B',
            serviceID    => 'F',
            countryCode  => 'G',
            dateBegin    => 'D',
            dateEnd      => 'E',
            productType  => 'M',
            formatType   => 'P',
            artistName   => 'O',
            upc          => 'I',
            albumName    => 'J',
            isrc         => 'I',
            trackName    => 'J',
            units        => 'R',
            currencyCode => 'U',
            price        => 'U',
        },
    );

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

sub currencyCode      { 'USD' }
sub _headerIdentifier { upc => 'Article Number' }
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 saleDates {
    my $self = shift;

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

    $_ =~ s/(\d{4})(\d{2})/$2-$1/ for $dateBegin, $dateEnd;

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

sub countryCode {
    my $self = shift;

    my $country = $self->_getByFieldName('countryCode') || '';
    my $oCountry = Common::Country->new( search => $country );
    return $oCountry->alpha2() if $oCountry;

    return 'VG' if $country =~ /^Virgin Islands \(British\)$/;

    return $self->handleError( "Unable to determine country code from '" . $country . "'", RPS::DB::Item::SaleImportError::kErrorCountry );
}

sub productType {
    my $self = shift;

    my $type = $self->_getByFieldName('productType') || '';
    if ( $type =~ /^(?:etrack|EVIDEO)$/i ) {
        return RPS::File::Sale::TYPE_TRACK;
    } elsif ( $type =~ /^(?:elp|eaahd|5CD|ESPMT)$/i ) {
        return RPS::File::Sale::TYPE_ALBUM;
    }

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

sub formatType {
    my $self = shift;

    my $type = $self->_getByFieldName('formatType');
    if ( $type =~ /^Permanent Download/i ) {
        return RPS::File::Sale::FORMAT_DOWNLOAD;
    } elsif (
        $type =~ /^
              Digital\sAllocations\s\(Streaming\)
            | Streaming\s\(subscription\)
            | Subscription\sStreaming\sby\sThird\sParty
        $/ix
      ) {
        return RPS::File::Sale::FORMAT_STREAM;
    }

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

sub upc {
    my $self = shift;
    return unless $self->productType eq RPS::File::Sale::TYPE_ALBUM;

    my $upc = $self->_getByFieldName('upc') || '';
    $upc =~ s/^10(\d+)/$1/;

    return $upc;
}

sub isrc {
    my $self = shift;
    return unless $self->productType eq RPS::File::Sale::TYPE_TRACK;

    my $isrc = $self->_getByFieldName('isrc') || '';
    $isrc =~ s/^5//;

    return $isrc;
}

sub albumName {
    my $self = shift;
    return unless $self->productType eq RPS::File::Sale::TYPE_ALBUM;

    return $self->_getByFieldName('albumName');
}

sub trackName {
    my $self = shift;
    return unless $self->productType eq RPS::File::Sale::TYPE_TRACK;

    return $self->_getByFieldName('trackName');
}

# MapFace
sub _mapFaceServiceID          { 'serviceID' }
sub _mapFaceMediaType          { }
sub _mapFaceCountryCode        { 'countryCode' }
sub _mapFaceProductType        { 'productType' }
sub _mapFaceFormatType         { 'formatType' }
sub _mapFaceCompatibleVersions { 22, 25 }

1;
