package RPS::Import::Caroline::v27;

use strict;
use warnings;

use lib '/app/tools/rps/lib';
use base 'RPS::Import::Caroline::v22';


sub _fieldMap {
    my $self = shift;

    my %fieldMap = (
        27 => {
            labelName    => 'S',
            serviceID    => 'F',
            countryCode  => 'G',
            dateBegin    => 'D',
            dateEnd      => 'E',
            productType  => 'M',
            formatType   => 'P',
            artistName   => 'O',
            upc          => 'I',
            albumName    => 'J',
            isrc         => 'I',
            trackName    => 'J',
            units        => 'U',
            currencyCode => 'Y',
            price        => 'Y',
        },
        28 => {
            labelName    => 'V',
            countryCode  => 'G',
            dateBegin    => 'D',
            dateEnd      => 'E',
            productType  => 'M',
            formatType   => 'P',
            artistName   => 'O',
            upc          => 'I',
            albumName    => 'J',
            isrc         => 'I',
            trackName    => 'J',
            units        => 'R',
            currencyCode => 'Y',
            price        => 'Y',
        },
        29 => {
            labelName    => 'W',
            serviceID    => 'F',
            countryCode  => 'G',
            dateBegin    => 'D',
            dateEnd      => 'E',
            productType  => 'N',
            formatType   => 'Q',
            artistName   => 'P',
            upc          => 'I',
            albumName    => 'J',
            isrc         => 'I',
            trackName    => 'J',
            units        => 'S',
            currencyCode => 'Z',
            price        => 'Z',
        },
        32 => {
            labelName    => 'W',
            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 => 'Y',
            price        => 'Y',
        },
        33 => {
            labelName    => 'X',
            serviceID    => 'G',
            countryCode  => 'H',
            dateBegin    => 'F',
            dateEnd      => 'F',
            productType  => 'M',
            formatType   => 'O',
            artistName   => 'D',
            upc          => 'J',
            albumName    => 'K',
            isrc         => 'J',
            trackName    => 'K',
            units        => 'Q',
            currencyCode => 'Z',
            price        => 'Z',
            mediaType    => 'M',
        },
        34 => {
            labelName    => 'Y',
            serviceID    => 'G',
            countryCode  => 'H',
            dateBegin    => 'F',
            dateEnd      => 'F',
            productType  => 'N',
            formatType   => 'P',
            artistName   => 'D',
            upc          => 'J',
            albumName    => 'K',
            isrc         => 'J',
            trackName    => 'K',
            units        => 'R',
            currencyCode => 'AA',
            price        => 'AA',
            mediaType    => 'N',
        },
    );

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

sub serviceID {
    my $self = shift;

    return $self->_version =~ /^(?:28)$/
        ? Client::Service::DSP_CAROLINE
        : $self->SUPER::serviceID();
}

sub upc {
    my $self = shift;

    return $self->SUPER::upc unless ($self->_version == 34);
    return unless $self->productType eq RPS::File::Sale::TYPE_ALBUM;

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

    return $upc;
}

sub formatType {
    my $self = shift;

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

    return $self->handleError( "Unable to determine format type from '$type'",
        RPS::DB::Item::SaleImportError::kErrorFormatType );
}

sub mediaType {
    my $self = shift;
    return $self->SUPER::mediaType unless $self->_version =~ /^(?:33)$/;

    my $type = $self->_getByFieldName('mediaType');
    if ( $type =~ /^(?:ETRACK|ELP|5CD|ESPMT)$/i ) {
        return RPS::DB::Item::MediaType::kMediaTypeAudio;
    } elsif ( $type =~ /^EVIDEO$/i ) {
        return RPS::DB::Item::MediaType::kMediaTypeVideo;
    }

    return $self->handleError( "Unable to determine media type from '$type'",
        RPS::DB::Item::SaleImportError::kErrorMediaType );
}

sub _isValidSaleRecord {
    my $self = shift;

    return defined $self->units && defined $self->_getByFieldName('price')
        && ( $self->_getByFieldName('albumName') || $self->_getByFieldName('trackName') );
}

sub _mapFaceMediaType {
    my $self = shift;

    return 'mediaType' if ($self->_version == 33);
    return $self->SUPER::_mapFaceMediaType();
}

sub _mapFaceCompatibleVersions { 27, 28, 29, 32, 33 }

1;
