package RPS::Import::MVD::v6;

use strict;

use base 'RPS::Import::Importer';

use RPS::Import::ServiceMap;

sub _fieldMap {
    return {
        serviceID       => 'G',
        countryCode     => 'L',
        dateBegin       => 'A',
        dateEnd         => 'A',
        productType     => 'B / D',
        formatType      => 'M',
        clientProductID => 'B',
        artistName      => 'C',
        albumName       => 'C',
        isrc            => 'D',
        trackName       => 'E',
        units           => 'I',
        currencyCode    => 'J',
        price           => 'K',
    }
}

sub _headerIdentifier { formatType => 'Type' }

my %serviceMap = (

);

sub serviceID {
    my $self = shift;

    my $service = lc( $self->_getByFieldName('serviceID') || '' );

    return Client::Service::DSP_AMAZON   if $service =~ /^(?:
        AMAZON\sVIDEO\sDIRECT | AMAZON\sDIGITAL\sAUDIO\s577854
    )$/ix;
    return Client::Service::DSP_DEEZER        if $service =~ /^MERLIN - DEEZER ACCT$/i;
    return Client::Service::DSP_FACEBOOK      if $service =~ /^MERLIN - FACEBOOK$/i;
    return Client::Service::DSP_FUGA          if $service =~ /^FUGA$/i;
    return Client::Service::DSP_GOOGLE        if $service =~ /^(?:
        GOOGLE\sTVOD\s9202597227 | GOOGLE\sPLAY\sAUDIO\s#103177
    )$/ix;
    return Client::Service::DSP_HOOPLA        if $service =~ /^MIDWEST TAPE \(HOOPLA\)$/i;
    return Client::Service::DSP_IHEARTMEDIA   if $service =~ /^MERLIN - IHEART ACCT$/i;
    return Client::Service::DSP_ITUNES        if $service =~ /^(?:
        VIDEO\sSERVICE\sCORP\/ITUNES\sACCT | ITUNES
    )$/ix;
    return Client::Service::DSP_MVD           if $service =~ /^(?:
        24\sHOUR\sMOVIE\sCHANNEL | ASIAN\sMEDIA\sRIGHTS | CINEDIGM |
        FANDOR\.COM | HAVOC\sTV | INDEMAND | INDIEFLIX\.COM |
        NIGHT\sFLIGHT\sLLC | KALEIDESCAPE,\sINC\. | ROOTS\sCHANNEL |
        STADIUM | TUBI\sTV | FILMS\sMEDIA\sGROUP\s\(DIGITAL\) |
        BIGSTAR\.TV | HAVOC\sTV | INDIEFLIX\.COM | TUBI\sTV |
        FLIXFLING\.COM | URBANPIXNOW\s\(CON\sCOMM\)
    )$/ix;
    return Client::Service::DSP_NETEASE       if $service =~ /^MERLIN\s-\sNETEASE\sCLOUD\sMUSIC$/i;
    return Client::Service::DSP_NEUROTICMEDIA if $service =~ /^NEUROTIC MEDIA$/i;
    return Client::Service::DSP_PANDORA       if $service =~ /^MERLIN - PANDORA ACCT$/i;
    return Client::Service::DSP_PLAYSTER      if $service =~ /^HYUNA \(PLAYSTER\)$/i;
    return Client::Service::DSP_SLACKERINC    if $service =~ /^MERLIN - SLACKER ACCT$/i;
    return Client::Service::DSP_SNAGFILMS     if $service =~ /^SNAGFILMS$/i;
    return Client::Service::DSP_SPOTIFY       if $service =~ /^MERLIN - SPOTIFY ACCT$/i;
    return Client::Service::DSP_VEVO          if $service =~ /^VEVO\.COM$/i;
    return Client::Service::DSP_VIMEO         if $service =~ /^vimeo \(vod\)$/i;
    return Client::Service::DSP_VUBIQUITY     if $service =~ /^(?:
        VUBIQUITY\s\(AVAIL\-TVN\) | vubiquity\s\(\samdocs\s\)
    )$/ix;
    return Client::Service::DSP_XBOX_MUSIC    if $service =~ /^UNCORK'D \(XBOX\)$/i;
    return Client::Service::DSP_YOUTUBE_RED   if $service =~ /^YOUTUBE \/ GOOGLE INC\.777704935$/i;

    my $serviceID = $self->getServiceID($service) || $RPS::Import::ServiceMap::SERVICE_ALIASES{$service};
    return $serviceID if $serviceID;

    $self->fail( "Unable to determine service name from: '$service'." )
}

sub countryCode {
    my $self = shift;

    my $name = $self->_getByFieldName('countryCode') || 'US';
    $name = 'US' if $name =~ /^World$/i;

	my $country = Common::Country->Get($name);
    return $country->alpha2() if $country;

	$self->fail('Missing country code.');
}

sub productType {
    my $self = shift;

    my $clientProductID = $self->_getByFieldName('clientProductID') || '';
    my $isrc            = $self->_getByFieldName('isrc')            || '';
    return $clientProductID =~ /^$isrc$/i
        ? RPS::File::Sale::TYPE_ALBUM
        : RPS::File::Sale::TYPE_TRACK;
}

sub formatType {
    my $self   = shift;

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

    return RPS::File::Sale::FORMAT_PERFORMANCE if $service =~ /^SOUNDEXCHANGE$/i;

    if ( $type =~ /^D(?:ownload)?$/i ) {
        return RPS::File::Sale::FORMAT_DOWNLOAD;
    } elsif ( $type =~ /^S(?:tream)?$/i ) {
        return RPS::File::Sale::FORMAT_STREAM;
    }

    $self->fail("Unable to determine format type from ($type)");
}

sub artistName {
    my $self = shift;

    my $name = $self->_getByFieldName('artistName') || '';
    ($name, undef) = split ' - ', $name;
    return $name;
}

sub albumName {
    my $self = shift;

    my $name = $self->_getByFieldName('albumName') || '';
    (undef, $name) = split ' - ', $name;
    return $name;
}

sub isrc {
    my $self = shift;

    return $self->_getByFieldName('isrc') if $self->productType eq RPS::File::Sale::TYPE_TRACK;
}

sub trackName {
    my $self = shift;

    return $self->_getByFieldName('trackName') if $self->productType eq RPS::File::Sale::TYPE_TRACK;
}

sub currencyCode {
    my $self = shift;

    my $code = $self->_getByFieldName('currencyCode');
    ($code) = $code =~ /^.*([a-z]{3})$/i;

    return $code;
}

sub _isValidSaleRecord {
    return $_[0]->_getByFieldName('units') || $_[0]->_getByFieldName('price');
}


1;