#---------------------------------------------------------------
# ____                   _ _         ____  _
#|  _ \ ___  _   _  __ _| | |_ _   _/ ___|| |__   __ _ _ __ ___
#| |_) / _ \| | | |/ _` | | __| | | \___ \| '_ \ / _` | '__/ _ \
#|  _ < (_) | |_| | (_| | | |_| |_| |___) | | | | (_| | | |  __/
#|_| \_\___/ \__, |\__,_|_|\__|\__, |____/|_| |_|\__,_|_|  \___|
#            |___/             |___/
#
# 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');
    my $serviceID = $self->serviceID;

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

    # If we can't find a mapping for product type,
    # we will use the presence of a UPC to determine it.
    # But only if we at least have a service ID!
    if ($productType) {
        return $productType;
    } elsif ($serviceID) {    
        if ( $self->upc ) {
            return RPS::File::Sale::TYPE_ALBUM;
        } else {
            return RPS::File::Sale::TYPE_TRACK;
        }
    } 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');
    my $serviceID = $self->serviceID;

    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');
    my $serviceID = $self->serviceID;

    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');
    my $upc = $self->_getByFieldName('upc');
    if ( $type =~ /totals/i || $upc =~ /totals/i) {
        return;
    }
    
    # Ignore blank lines.
    my $price = $self->_getByFieldName('price');
    my $units = $self->_getByFieldName('units');
    if ( !$price && !$units ) {
        return;
    }      

    # Let's just make sure we have some kind of identifier.
    if ( $self->albumName || $self->upc || $self->trackName || $self->isrc ) {
        return 1;
    } else {
        $self->fail("Missing identifier for product");
    }  

    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.
###
