#---------------------------------------------------------------
# ____                   _ _         ____  _
#|  _ \ ___  _   _  __ _| | |_ _   _/ ___|| |__   __ _ _ __ ___
#| |_) / _ \| | | |/ _` | | __| | | \___ \| '_ \ / _` | '__/ _ \
#|  _ < (_) | |_| | (_| | | |_| |_| |___) | | | | (_| | | |  __/
#|_| \_\___/ \__, |\__,_|_|\__|\__, |____/|_| |_|\__,_|_|  \___|
#            |___/             |___/
#
# Copyright (C) 2010 RoyaltyShare, Inc.   All Rights Reserved
#---------------------------------------------------------------

package RPS::Import::EssentialDistribution::v2;

use strict;

use Data::Dumper;

use Spreadsheet::ParseExcel;

use lib '/app/tools/common/lib';
use Common::Assert;
use Common::Log;

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

use lib '/app/tools/rps/lib';
use RPS::Import::Importer;
use base 'RPS::Import::MapFaceBase';
use base 'RPS::Import::Importer';

sub _fieldMap {
    {
        albumName        => 'G',
        trackName        => 'G',
        serviceID        => 'A',

        artistName       => 'F',
        countryCode      => 'B',
        dateBegin        => 'C',
        labelName        => 'E',
        productType      => 'J',
        upc              => 'I',
        isrc             => 'H', # only if track
        clientProductID  => 'H', # only if album

        units            => 'K',
        price            => 'N',
    }
}

my %vendorProductFormatMap = (
    Client::Service::DSP_247() => {
        'digi album' => {
            'product' => RPS::File::Sale::TYPE_ALBUM,
            'format'  => RPS::File::Sale::FORMAT_DOWNLOAD,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'digital album' => {
            'product' => RPS::File::Sale::TYPE_ALBUM,
            'format'  => RPS::File::Sale::FORMAT_DOWNLOAD,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'digital single' => {
            'product' => RPS::File::Sale::TYPE_TRACK,
            'format'  => RPS::File::Sale::FORMAT_DOWNLOAD,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
    },
    Client::Service::DSP_7DIGITAL() => {
        'digi album' => {
            'product' => RPS::File::Sale::TYPE_ALBUM,
            'format'  => RPS::File::Sale::FORMAT_DOWNLOAD,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'digital album' => {
            'product' => RPS::File::Sale::TYPE_ALBUM,
            'format'  => RPS::File::Sale::FORMAT_DOWNLOAD,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'digital single' => {
            'product' => RPS::File::Sale::TYPE_TRACK,
            'format'  => RPS::File::Sale::FORMAT_DOWNLOAD,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
    },
    Client::Service::DSP_AMAZON() => {
        'digi album' => {
            'product' => RPS::File::Sale::TYPE_ALBUM,
            'format'  => RPS::File::Sale::FORMAT_DOWNLOAD,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'digital album' => {
            'product' => RPS::File::Sale::TYPE_ALBUM,
            'format'  => RPS::File::Sale::FORMAT_DOWNLOAD,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'digital single' => {
            'product' => RPS::File::Sale::TYPE_TRACK,
            'format'  => RPS::File::Sale::FORMAT_DOWNLOAD,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'digital track' => { # FB4355
            'product' => RPS::File::Sale::TYPE_TRACK,
            'format'  => RPS::File::Sale::FORMAT_DOWNLOAD,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'video' => {
            'product' => RPS::File::Sale::TYPE_TRACK,
            'format'  => RPS::File::Sale::FORMAT_DOWNLOAD,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeVideo,
        },
    },
    Client::Service::DSP_BLEEP() => { #FB8938
        'digital album' => {
            'product' => RPS::File::Sale::TYPE_ALBUM,
            'format'  => RPS::File::Sale::FORMAT_DOWNLOAD,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
    },
    Client::Service::DSP_BLINKBOX_MUSIC() => {
        'digital track' => {
            'product' => RPS::File::Sale::TYPE_TRACK,
            'format'  => RPS::File::Sale::FORMAT_STREAM,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
    },
    Client::Service::DSP_EIRCOM() => {
        'digital single' => {
            'product' => RPS::File::Sale::TYPE_TRACK,
            'format'  => RPS::File::Sale::FORMAT_STREAM,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
    },
    Client::Service::DSP_EMUSIC() => {
        'digi album' => {
            'product' => RPS::File::Sale::TYPE_ALBUM,
            'format'  => RPS::File::Sale::FORMAT_DOWNLOAD, # Note: will be forced to VPD (see _insertSale in RPS/Import/Importer.pm)
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'digital single' => {
            'product' => RPS::File::Sale::TYPE_TRACK,
            'format'  => RPS::File::Sale::FORMAT_DOWNLOAD,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'digital track' => { #FB4948
            'product' => RPS::File::Sale::TYPE_TRACK,
            'format'  => RPS::File::Sale::FORMAT_VPD,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
    },
    Client::Service::DSP_FUGA() => { #FB8988
        'digital single' => {
            'product' => RPS::File::Sale::TYPE_TRACK,
            'format'  => RPS::File::Sale::FORMAT_DOWNLOAD,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
    },
    Client::Service::DSP_GOOGLE() => {
        'digi album' => {
            'product' => RPS::File::Sale::TYPE_ALBUM,
            'format'  => RPS::File::Sale::FORMAT_DOWNLOAD,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'digital album' => {
            'product' => RPS::File::Sale::TYPE_ALBUM,
            'format'  => RPS::File::Sale::FORMAT_DOWNLOAD,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'digital single' => {
            'product' => RPS::File::Sale::TYPE_TRACK,
            'format'  => RPS::File::Sale::FORMAT_DOWNLOAD,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'digital stream' => { # FB4355
            'product' => RPS::File::Sale::TYPE_TRACK,
            'format'  => RPS::File::Sale::FORMAT_STREAM,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'digital track' => { # FB4355
            'product' => RPS::File::Sale::TYPE_TRACK,
            'format'  => RPS::File::Sale::FORMAT_DOWNLOAD,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'video' => { # FBoD4620
            'product' => RPS::File::Sale::TYPE_TRACK,
            'format'  => RPS::File::Sale::FORMAT_DOWNLOAD,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeVideo,
        },
    },
    Client::Service::DSP_IMI_MOBILE() => {
        'digi album' => {
            'product' => RPS::File::Sale::TYPE_ALBUM,
            'format'  => RPS::File::Sale::FORMAT_DOWNLOAD,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'digital album' => {
            'product' => RPS::File::Sale::TYPE_ALBUM,
            'format'  => RPS::File::Sale::FORMAT_DOWNLOAD,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'digital single' => {
            'product' => RPS::File::Sale::TYPE_TRACK,
            'format'  => RPS::File::Sale::FORMAT_DOWNLOAD,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
    },
    Client::Service::DSP_IMIMOBILE() => { #FB4940
        'digital album' => {
            'product' => RPS::File::Sale::TYPE_ALBUM,
            'format'  => RPS::File::Sale::FORMAT_DOWNLOAD,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'digital single' => {
            'product' => RPS::File::Sale::TYPE_TRACK,
            'format'  => RPS::File::Sale::FORMAT_DOWNLOAD,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
    },
    Client::Service::DSP_ITUNES() => {
        'digi album' => {
            'product' => RPS::File::Sale::TYPE_ALBUM,
            'format'  => RPS::File::Sale::FORMAT_DOWNLOAD,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'digital single' => {
            'product' => RPS::File::Sale::TYPE_TRACK,
            'format'  => RPS::File::Sale::FORMAT_DOWNLOAD,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'digital album' => {
            'product' => RPS::File::Sale::TYPE_ALBUM,
            'format'  => RPS::File::Sale::FORMAT_DOWNLOAD,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'digital track' => { # FB4355
            'product' => RPS::File::Sale::TYPE_TRACK,
            'format'  => RPS::File::Sale::FORMAT_DOWNLOAD,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'digital video' => { # FB4355
            'product' => RPS::File::Sale::TYPE_TRACK,
            'format'  => RPS::File::Sale::FORMAT_DOWNLOAD,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeVideo,
        },
        'video' => {
            'product' => RPS::File::Sale::TYPE_TRACK,
            'format'  => RPS::File::Sale::FORMAT_DOWNLOAD,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeVideo,
        },
    },
    Client::Service::DSP_JUNO() => {
        'digital album' => { # FB4355
            'product' => RPS::File::Sale::TYPE_ALBUM,
            'format'  => RPS::File::Sale::FORMAT_DOWNLOAD,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'digital single' => {
            'product' => RPS::File::Sale::TYPE_TRACK,
            'format'  => RPS::File::Sale::FORMAT_DOWNLOAD,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'digital track' => { # FB4355
            'product' => RPS::File::Sale::TYPE_TRACK,
            'format'  => RPS::File::Sale::FORMAT_DOWNLOAD,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
    },
    Client::Service::DSP_MERLIN() => {
        'digi album' => {
            'product' => RPS::File::Sale::TYPE_ALBUM,
            'format'  => RPS::File::Sale::FORMAT_DOWNLOAD,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'digital album' => {
            'product' => RPS::File::Sale::TYPE_ALBUM,
            'format'  => RPS::File::Sale::FORMAT_DOWNLOAD,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'digital single' => {
            'product' => RPS::File::Sale::TYPE_TRACK,
            'format'  => RPS::File::Sale::FORMAT_DOWNLOAD,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
    },
    Client::Service::DSP_MUSIC_QUBED() => { # FB4355
        'digital stream' => { # FB4355
            'product' => RPS::File::Sale::TYPE_TRACK,
            'format'  => RPS::File::Sale::FORMAT_STREAM,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
    },
    Client::Service::DSP_MUSICLOAD() => { # FBoD4590
        'digital album' => { # FBoD4590
            'product' => RPS::File::Sale::TYPE_ALBUM,
            'format'  => RPS::File::Sale::FORMAT_DOWNLOAD,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'digital single' => { # FBoD4590
            'product' => RPS::File::Sale::TYPE_TRACK,
            'format'  => RPS::File::Sale::FORMAT_DOWNLOAD,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
    },
    Client::Service::DSP_NOKIA() => {
        'digital album' => {
            'product' => RPS::File::Sale::TYPE_ALBUM,
            'format'  => RPS::File::Sale::FORMAT_DOWNLOAD,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'digital single' => {
            'product' => RPS::File::Sale::TYPE_TRACK,
            'format'  => RPS::File::Sale::FORMAT_DOWNLOAD,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'digital track' => { # FB4355
            'product' => RPS::File::Sale::TYPE_TRACK,
            'format'  => RPS::File::Sale::FORMAT_DOWNLOAD,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
    },
    Client::Service::DSP_OVI_MUSIC () => {
        'digital single' => {
            'product' => RPS::File::Sale::TYPE_TRACK,
            'format'  => RPS::File::Sale::FORMAT_DOWNLOAD,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'digi album' => {
            'product' => RPS::File::Sale::TYPE_ALBUM,
            'format'  => RPS::File::Sale::FORMAT_DOWNLOAD,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
    },
    Client::Service::DSP_RARA() => {
        'digi album' => {
            'product' => RPS::File::Sale::TYPE_ALBUM,
            'format'  => RPS::File::Sale::FORMAT_DOWNLOAD,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'digital album' => {
            'product' => RPS::File::Sale::TYPE_ALBUM,
            'format'  => RPS::File::Sale::FORMAT_DOWNLOAD,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'premium stream' => { #FB4948
            'product' => RPS::File::Sale::TYPE_TRACK,
            'format'  => RPS::File::Sale::FORMAT_STREAM,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
    },
    Client::Service::DSP_RDIO() => {
        'ad-funded stream' => { # FB4355
            'product' => RPS::File::Sale::TYPE_TRACK,
            'format'  => RPS::File::Sale::FORMAT_STREAM,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'premium stream' => { # FB4355
            'product' => RPS::File::Sale::TYPE_TRACK,
            'format'  => RPS::File::Sale::FORMAT_STREAM,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'digi album' => {
            'product' => RPS::File::Sale::TYPE_ALBUM,
            'format'  => RPS::File::Sale::FORMAT_STREAM,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
    },
    Client::Service::DSP_REAL() => {
        'digi album' => {
            'product' => RPS::File::Sale::TYPE_ALBUM,
            'format'  => RPS::File::Sale::FORMAT_STREAM,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
    },
    Client::Service::DSP_SAINSBURYS() => {
        'digital album' => {
            'product' => RPS::File::Sale::TYPE_ALBUM,
            'format'  => RPS::File::Sale::FORMAT_DOWNLOAD,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'digital single' => {
            'product' => RPS::File::Sale::TYPE_TRACK,
            'format'  => RPS::File::Sale::FORMAT_DOWNLOAD,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'digital track' => { # FB4355
            'product' => RPS::File::Sale::TYPE_TRACK,
            'format'  => RPS::File::Sale::FORMAT_DOWNLOAD,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
    },
    Client::Service::DSP_SIMFY() => { #FB8988
        'premium stream' => {
            'product' => RPS::File::Sale::TYPE_TRACK,
            'format'  => RPS::File::Sale::FORMAT_STREAM,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
    },
    Client::Service::DSP_SONY_MUSIC() => { # FB4355
        'digital stream' => { # FB4355
            'product' => RPS::File::Sale::TYPE_TRACK,
            'format'  => RPS::File::Sale::FORMAT_STREAM,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
    },
    Client::Service::DSP_SPOTIFY() => {
        'ad-funded stream' => { # FB4355
            'product' => RPS::File::Sale::TYPE_TRACK,
            'format'  => RPS::File::Sale::FORMAT_STREAM,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'premium stream' => { # FB4355
            'product' => RPS::File::Sale::TYPE_TRACK,
            'format'  => RPS::File::Sale::FORMAT_STREAM,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'digi album' => {
            'product' => RPS::File::Sale::TYPE_ALBUM,
            'format'  => RPS::File::Sale::FORMAT_STREAM,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'digital single' => {
            'product' => RPS::File::Sale::TYPE_TRACK,
            'format'  => RPS::File::Sale::FORMAT_STREAM,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
    },
    Client::Service::DSP_STARZIK() => { # FBoD4620
        'digital single' => { # FBoD4620
            'product' => RPS::File::Sale::TYPE_TRACK,
            'format'  => RPS::File::Sale::FORMAT_DOWNLOAD,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'video' => { # FBoD4620
            'product' => RPS::File::Sale::TYPE_TRACK,
            'format'  => RPS::File::Sale::FORMAT_DOWNLOAD,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeVideo,
        },
    },
    Client::Service::DSP_VEVO() => { # FBoD4590
        'video' => { # FBoD4590
            'product' => RPS::File::Sale::TYPE_TRACK,
            'format'  => RPS::File::Sale::FORMAT_STREAM,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeVideo,
        },
    },
    Client::Service::DSP_VIDZONEDIGITAL() => {
        'digital single' => {
            'product' => RPS::File::Sale::TYPE_TRACK,
            'format'  => RPS::File::Sale::FORMAT_DOWNLOAD,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'digital album' => {
            'product' => RPS::File::Sale::TYPE_TRACK,
            'format'  => RPS::File::Sale::FORMAT_DOWNLOAD,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'digital track' => { # FB4355
            'product' => RPS::File::Sale::TYPE_TRACK,
            'format'  => RPS::File::Sale::FORMAT_DOWNLOAD,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
    },
    Client::Service::DSP_WE7() => {
        'digi album' => {
            'product' => RPS::File::Sale::TYPE_ALBUM,
            'format'  => RPS::File::Sale::FORMAT_STREAM,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
    },
    Client::Service::DSP_XBOX_MUSIC() => {
        'digital album' => {
            'product' => RPS::File::Sale::TYPE_ALBUM,
            'format'  => RPS::File::Sale::FORMAT_DOWNLOAD,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'digital single' => {
            'product' => RPS::File::Sale::TYPE_TRACK,
            'format'  => RPS::File::Sale::FORMAT_DOWNLOAD,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'digital stream' => {
            'product' => RPS::File::Sale::TYPE_TRACK,
            'format'  => RPS::File::Sale::FORMAT_STREAM,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'digital track' => { # FB4355
            'product' => RPS::File::Sale::TYPE_TRACK,
            'format'  => RPS::File::Sale::FORMAT_DOWNLOAD,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'premium stream' => { # FB4355
            'product' => RPS::File::Sale::TYPE_TRACK,
            'format'  => RPS::File::Sale::FORMAT_STREAM,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
    },
    Client::Service::DSP_YOUTUBE() => {
        'digi album' => {
            'product' => RPS::File::Sale::TYPE_ALBUM,
            'format'  => RPS::File::Sale::FORMAT_STREAM,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'digital album' => {
            'product' => RPS::File::Sale::TYPE_ALBUM,
            'format'  => RPS::File::Sale::FORMAT_STREAM,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'digital stream' => { # FB4355
            'product' => RPS::File::Sale::TYPE_TRACK,
            'format'  => RPS::File::Sale::FORMAT_STREAM,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'digital video' => { # FB4355
            'product' => RPS::File::Sale::TYPE_TRACK,
            'format'  => RPS::File::Sale::FORMAT_STREAM,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeVideo,
        },
        'video' => {
            'product' => RPS::File::Sale::TYPE_TRACK,
            'format'  => RPS::File::Sale::FORMAT_STREAM,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeVideo,
        },
        'premium stream' => { # FB4948
            'product' => RPS::File::Sale::TYPE_TRACK,
            'format'  => RPS::File::Sale::FORMAT_STREAM,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeVideo,
        },
    },
    Client::Service::DSP_ASPIRO() => {
        'digital stream' => {
            'product' => RPS::File::Sale::TYPE_TRACK,
            'format'  => RPS::File::Sale::FORMAT_STREAM,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'ad-funded stream' => {
            'product' => RPS::File::Sale::TYPE_TRACK,
            'format'  => RPS::File::Sale::FORMAT_STREAM,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'digital album' => {
            'product' => RPS::File::Sale::TYPE_ALBUM,
            'format'  => RPS::File::Sale::FORMAT_DOWNLOAD,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'premium stream' => {
            'product' => RPS::File::Sale::TYPE_TRACK,
            'format'  => RPS::File::Sale::FORMAT_STREAM,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'promo stream' => {
            'product' => RPS::File::Sale::TYPE_TRACK,
            'format'  => RPS::File::Sale::FORMAT_STREAM,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'digital track' => {
            'product' => RPS::File::Sale::TYPE_TRACK,
            'format'  => RPS::File::Sale::FORMAT_DOWNLOAD,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
    },
    Client::Service::DSP_QOBUZ() => {
        'digital album' => {
            'product' => RPS::File::Sale::TYPE_ALBUM,
            'format'  => RPS::File::Sale::FORMAT_DOWNLOAD,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'digital single' => { #FBoD4620
            'product' => RPS::File::Sale::TYPE_TRACK,
            'format'  => RPS::File::Sale::FORMAT_DOWNLOAD,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'digital stream' => {
            'product' => RPS::File::Sale::TYPE_TRACK,
            'format'  => RPS::File::Sale::FORMAT_STREAM,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'digital track' => {
            'product' => RPS::File::Sale::TYPE_TRACK,
            'format'  => RPS::File::Sale::FORMAT_DOWNLOAD,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
    },
    Client::Service::DSP_MUZU_TV() => {
        'digital video' => { # FB7582
            'product' => RPS::File::Sale::TYPE_TRACK,
            'format'  => RPS::File::Sale::FORMAT_STREAM,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeVideo,
        },
    },
    Client::Service::DSP_ROUGHTRADE() => {
        'digital album' => { # FB7582
            'product' => RPS::File::Sale::TYPE_ALBUM,
            'format'  => RPS::File::Sale::FORMAT_DOWNLOAD,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
    },
);

sub _headerIdentifier { ( productType => 'Format' ) }

sub currencyCode { 'GBP' }

sub _getMappings {
    my $self = shift;
    my $type = shift;  
    my $serviceID = shift;

    my $productType;
    my $formatType;
    my $mediaType;

    if( $type =~ /^digital stream$/i )
    {
        # Treat anything 'digital stream' as a Track / Stream / Audio
        # (see FB17684).
        #
        $productType = RPS::File::Sale::TYPE_TRACK;
        $formatType  = RPS::File::Sale::FORMAT_STREAM;
        $mediaType   = RPS::DB::Item::MediaType::kMediaTypeAudio;
    }
    else
    {
        if( exists $vendorProductFormatMap{ $serviceID } )
        {
            if( exists $vendorProductFormatMap{ $serviceID }{ lc $type } )
            {
                $productType = $vendorProductFormatMap{ $serviceID }{ lc $type }{ product };
                $formatType  = $vendorProductFormatMap{ $serviceID }{ lc $type }{ format  };
                $mediaType   = $vendorProductFormatMap{ $serviceID }{ lc $type }{ media   };
            }
        }
    }

    return( $productType, $formatType, $mediaType );
}

sub saleDates {
    my $self = shift;
    my $sdate = $self->_getByFieldName('dateBegin');
    my $dateBegin;
    my $dateEnd;

    if( $sdate =~ /^\d{5}$/ )
    {
        $sdate = Spreadsheet::ParseExcel::Utility::ExcelFmt( "yyyy-mm-dd", $sdate );
    }

    ($dateBegin, $dateEnd) = $self->_getDates( date_begin => $sdate );

    return( $dateBegin, $dateEnd );
}

sub productType {
    my $self = shift;

    my $type = $self->_getByFieldName('productType') || return;
    my $serviceID = $self->serviceID || return;

    my( $productType, $formatType, $mediaType ) = $self->_getMappings( $type, $serviceID );

    if ($productType)
    {
        return $productType;
    }
    else
    {
        return $self->handleError("Unable to determine product type from service '$serviceID' type '$type'", RPS::DB::Item::SaleImportError::kErrorProductType );    
    }
}

sub formatType {
    my $self = shift;

    my $type = $self->_getByFieldName('productType') || return;
    my $serviceID = $self->serviceID || return;

    my( $productType, $formatType, $mediaType ) = $self->_getMappings( $type, $serviceID );

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

sub mediaType {
    my $self = shift;

    my $type = $self->_getByFieldName('productType') || return;
    my $serviceID = $self->serviceID || return;

    my( $productType, $formatType, $mediaType ) = $self->_getMappings( $type, $serviceID );

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

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

    if( !defined $self->productType )
    {
        # Treat anything 'digital stream' as a Track / Stream / Audio
        # (see FB17684).
        my $type = $self->_getByFieldName('productType');
        return '' if( $type =~ /digital stream/i );  # if it has digital stream anywhere in the config, then it's probably a track ...

        # If the ISRC doesn't start with two letters then it's probably a catalog number
        my $isrc = $self->_getByFieldName('isrc');
        return $albumName if( $isrc && $isrc !~ /^[a-z]{2}/i );
    }
}

sub clientProductID {
    my $self = shift;
    my $clientProductID = $self->_getByFieldName('clientProductID') || return;
    return $clientProductID if( $self->productType eq RPS::File::Sale::TYPE_ALBUM );
}

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

    if( !defined $self->productType )
    {
        # Treat anything 'digital stream' as a Track / Stream / Audio
        # (see FB17684).
        my $type = $self->_getByFieldName('productType');
        return $trackName if( $type =~ /digital stream/i );  # if it has digital stream anywhere in the config, then it's probably a track ...

        # If the ISRC starts with two letters then maybe it's an ISRC
        my $isrc = $self->_getByFieldName('isrc');
        return $trackName if( $isrc =~ /^[a-z]{2}/i );
    }
}

sub isrc {
    my $self = shift;
    my $isrc = $self->_getByFieldName('isrc') || return;
    return $isrc if( $self->productType eq RPS::File::Sale::TYPE_TRACK );

    if( !defined $self->productType )
    {
        # Treat anything 'digital stream' as a Track / Stream / Audio
        # (see FB17684).
        my $type = $self->_getByFieldName('productType');
        return $isrc if( $type =~ /digital stream/ );  # if it has digital stream anywhere in the config, then it's probably a track ...

        # If the ISRC starts with two letters then maybe it's an ISRC
        return $isrc if( $isrc =~ /^[a-z]{2}/i );
    }
}

sub serviceID {
    my $self = shift;
    my $serviceName = $self->_getByFieldName('serviceID') || return;

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

    $serviceID = Client::Service::DSP_247 if( !$serviceID && $serviceName =~ /^24-7 Entertainment GmbH/i );

    return $serviceID if( $serviceID );

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

sub price {
    my $price = abs( shift->SUPER::price() );
    return $price;
}

sub units {
    my $self = shift;
    my $units = $self->SUPER::units() || return;
    my $price = $self->SUPER::price();

    if( defined($price) ) {
        return $price < 0 ? abs($units) * -1 : $units;
    } else {
        return $units;
    }
}

sub unitPrice { abs( shift->SUPER::unitPrice ) }

sub countryCode
{
    my $self = shift;
    my $countryCode = $self->_getByFieldName('countryCode');

    $countryCode = 'GB' if lc($countryCode) eq 'ww';

    if( $countryCode )
    {
        my $c = new Common::Country( search => $countryCode );
        return $c->alpha2() if( $c );
    }

    return $countryCode; # Return original name and let MapFace deal with it
}

sub _isValidSaleRecord {
    my $self = shift;
    
    # Ignore the subtotal line.
    my $type = $self->_getByFieldName('productType');
    if ($type =~ /totals/i) {
        return;   
    }
    
    # For albums, we need either a UPC or Album Name
    if ( $self->productType eq RPS::File::Sale::TYPE_ALBUM ) {
        if ( $self->albumName || $self->upc ) {
            return 1;
        } else {
            $self->fail( "Missing title and upc for album product" );
        }
    }

    # For tracks, we need either an ISRC or Track Name
    if ( $self->productType eq RPS::File::Sale::TYPE_TRACK ) {
        if ( $self->trackName || $self->isrc ) {
            return 1;
        } else {
            $self->fail( "Missing title and isrc for track product" );
        }            
    }

    # For MapFace, let unknown products in only if we have track or ISRC information
    #
    if ( !defined $self->productType ) {
        return 1 if ( $self->trackName || $self->isrc );
    }

    return  $self->SUPER::_isValidSaleRecord;
}

#####    MapFace    #####
#

sub _mapFaceServiceID {
    return('serviceID');
}

sub _mapFaceCountryCode {
    return('countryCode');
}

sub _mapFaceProductType {
    return('productType','serviceID');
}

sub _mapFaceFormatType {
    return('productType','serviceID');
}

sub _mapFaceMediaType {
    return('productType','serviceID');
}

###
1;# Play nicely.
###
