package RPS::Import::INGroovesBase2014;

use strict;

use Date::Calc qw(Days_in_Month Add_Delta_Days Decode_Month);
use Data::Dumper;

use lib '/app/tools/common/lib';
use Common::Country;

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

# In 2014, INGrooves started supplying SALES TYPE values that we could trust
# a bit more across services, so we started taking advantage of that.
# This fine data structure here models that. We'll look here first to see if
# we can ferret out product, format, and media type and if not, we'll fall
# back to the tried and true %gServiceFormatMap found in INGroovesBase2013.
#
# It's worth noting that some entries here short-circuit ones we defined
# previously in %gServiceFormatMap, but that's both okay and not worth
# removing legacy entries for. Just something to keep in mind if you're
# looking at a specific transaction and thing it's being handled by a
# gServiceFormatMap entry. Maybe it's not and being handled here instead.
#    
my %gSaleAssetProductType =
(
    '' => {
        'video' => {
            'audio album' => {
                exceptions   => ['youtube'],
                product_type => RPS::File::Sale::TYPE_TRACK, 
                format_type  => RPS::File::Sale::FORMAT_STREAM,
                media_type   => RPS::DB::Item::MediaType::kMediaTypeVideo,
            },
            'audio video bundle' => {
                product_type => RPS::File::Sale::TYPE_TRACK, 
                format_type  => RPS::File::Sale::FORMAT_STREAM,
                media_type   => RPS::DB::Item::MediaType::kMediaTypeVideo,
            },
            'music video' => {
                product_type    => RPS::File::Sale::TYPE_TRACK,
                format_type     => RPS::File::Sale::FORMAT_STREAM,
                media_type      => RPS::DB::Item::MediaType::kMediaTypeVideo,
            },
            
        },
    },
    'album downloads' => {
        'album' => {
            'audio album' => {
                exceptions      => ['emusic', 'beat port'],
                product_type    => RPS::File::Sale::TYPE_ALBUM,
                format_type     => RPS::File::Sale::FORMAT_DOWNLOAD,
                media_type      => RPS::DB::Item::MediaType::kMediaTypeAudio,
            },
            'audio video bundle' => {
                exceptions      => ['emusic', 'beat port'],
                product_type    => RPS::File::Sale::TYPE_ALBUM,
                format_type     => RPS::File::Sale::FORMAT_DOWNLOAD,
                media_type      => RPS::DB::Item::MediaType::kMediaTypeAudio,
            },
        },
    },
    'cloud streaming (music video)' => {
        'video' => {
            'audio album' => {
                product_type    => RPS::File::Sale::TYPE_TRACK,
                format_type     => RPS::File::Sale::FORMAT_STREAM,
                media_type      => RPS::DB::Item::MediaType::kMediaTypeAudio,
            },
            'music video' => {
                product_type    => RPS::File::Sale::TYPE_TRACK,
                format_type     => RPS::File::Sale::FORMAT_STREAM,
                media_type      => RPS::DB::Item::MediaType::kMediaTypeVideo,
            },
        },
    },
    'cloud streaming (track)' => {
        'track' => {
            'audio album' => {
                product_type    => RPS::File::Sale::TYPE_TRACK,
                format_type     => RPS::File::Sale::FORMAT_STREAM,
                media_type      => RPS::DB::Item::MediaType::kMediaTypeAudio,
            },
            'master service tone/ ringback tone' => {
                product_type => RPS::File::Sale::TYPE_TRACK,
                format_type  => RPS::File::Sale::FORMAT_STREAM,
                media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
            },
        },
    },
    'download (cma)' => {
        'album completion' => {
            'audio album' => {
                check_isrc  => 1,
                format_type => RPS::File::Sale::FORMAT_DOWNLOAD,
                media_type  => RPS::DB::Item::MediaType::kMediaTypeAudio,
            },
            'audio video bundle' => {
                check_isrc  => 1,
                format_type => RPS::File::Sale::FORMAT_DOWNLOAD,
                media_type  => RPS::DB::Item::MediaType::kMediaTypeAudio,
            },
            'music video' => {
                check_isrc  => 1,
                format_type =>  RPS::File::Sale::FORMAT_DOWNLOAD,
                media_type  => RPS::DB::Item::MediaType::kMediaTypeVideo,
            },
        },
    },
    'download (music video)' => {
        'video' => {
            'audio album' => {
                product_type => RPS::File::Sale::TYPE_TRACK, 
                format_type  => RPS::File::Sale::FORMAT_DOWNLOAD,
                media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
            },
            'music video' => {
                product_type => RPS::File::Sale::TYPE_TRACK, 
                format_type  => RPS::File::Sale::FORMAT_DOWNLOAD,
                media_type   => RPS::DB::Item::MediaType::kMediaTypeVideo,
            },
            'audio video bundle' => {
                product_type => RPS::File::Sale::TYPE_TRACK, 
                format_type  => RPS::File::Sale::FORMAT_DOWNLOAD,
                media_type   => RPS::DB::Item::MediaType::kMediaTypeVideo,
            },
        },
    },
    'download (ug ringtone)' => {
        'user generated ringtone' => {
            'audio album' => {
                product_type => RPS::File::Sale::TYPE_TRACK,
                format_type  => RPS::File::Sale::FORMAT_RINGTONE,
                media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
            },
        },
    },
    'interactive stream (track)' => {
        'track' => {
            'audio album' => {
                product_type => RPS::File::Sale::TYPE_TRACK, 
                format_type  => RPS::File::Sale::FORMAT_STREAM,
                media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio
            },
            'audio video bundle' => {
                product_type => RPS::File::Sale::TYPE_TRACK, 
                format_type  => RPS::File::Sale::FORMAT_STREAM,
                media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio
            },
            'master service tone/ ringback tone' => {
                product_type => RPS::File::Sale::TYPE_TRACK, 
                format_type  => RPS::File::Sale::FORMAT_STREAM,
                media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio
            },
            'music video' => {
                product_type => RPS::File::Sale::TYPE_TRACK, 
                format_type  => RPS::File::Sale::FORMAT_STREAM,
                media_type   => RPS::DB::Item::MediaType::kMediaTypeVideo
            },
            '' => {
                product_type => RPS::File::Sale::TYPE_TRACK, 
                format_type  => RPS::File::Sale::FORMAT_STREAM,
                media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio
            },
        },
    },
    'non-interactive stream (track)' => {
        'track' => {
            'audio album' => {
                product_type    => RPS::File::Sale::TYPE_TRACK,
                format_type     => RPS::File::Sale::FORMAT_STREAM,
                media_type      => RPS::DB::Item::MediaType::kMediaTypeAudio,
            },
            'master service tone/ ringback tone' => {
                product_type    => RPS::File::Sale::TYPE_TRACK,
                format_type     => RPS::File::Sale::FORMAT_STREAM,
                media_type      => RPS::DB::Item::MediaType::kMediaTypeAudio,
            },
            '' => {
                product_type => RPS::File::Sale::TYPE_TRACK, 
                format_type  => RPS::File::Sale::FORMAT_STREAM,
                media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio
            },
        },
    },
    'radio streaming (track)' => {
        'track' => {
            'audio album' => {
                product_type    => RPS::File::Sale::TYPE_TRACK,
                format_type     => RPS::File::Sale::FORMAT_STREAM,
                media_type      => RPS::DB::Item::MediaType::kMediaTypeAudio,
            },
            'audio video bundle' => {
                product_type    => RPS::File::Sale::TYPE_TRACK,
                format_type     => RPS::File::Sale::FORMAT_STREAM,
                media_type      => RPS::DB::Item::MediaType::kMediaTypeAudio,
            },
        },
    },
    'ringtones' => {
        'ringtone' => {
            'master service tone/ ringback tone' => {
                product_type    => RPS::File::Sale::TYPE_TRACK,
                format_type     => RPS::File::Sale::FORMAT_RINGTONE,
                media_type      => RPS::DB::Item::MediaType::kMediaTypeAudio,
            },
            'master service tone' => {
                product_type    => RPS::File::Sale::TYPE_TRACK,
                format_type     => RPS::File::Sale::FORMAT_RINGTONE,
                media_type      => RPS::DB::Item::MediaType::kMediaTypeAudio,
            },
        },
    },
    'streaming (music video)' =>
    {
        'video' => {
            'audio album' => {
                product_type    => RPS::File::Sale::TYPE_TRACK,
                format_type     => RPS::File::Sale::FORMAT_STREAM,
                media_type      => RPS::DB::Item::MediaType::kMediaTypeAudio,
            },
            'music video' => {
                product_type    => RPS::File::Sale::TYPE_TRACK,
                format_type     => RPS::File::Sale::FORMAT_STREAM,
                media_type      => RPS::DB::Item::MediaType::kMediaTypeVideo,
            },
        },
    },
    'streaming (track)' => {
        'track' => {
            'audio album' => {
                product_type    => RPS::File::Sale::TYPE_TRACK,
                format_type     => RPS::File::Sale::FORMAT_STREAM,
                media_type      => RPS::DB::Item::MediaType::kMediaTypeAudio,
            },
        },
    },
    'subscription streaming (tracks)' => {
        'track' => {
            'audio album' => {
                product_type    => RPS::File::Sale::TYPE_TRACK,
                format_type     => RPS::File::Sale::FORMAT_STREAM,
                media_type      => RPS::DB::Item::MediaType::kMediaTypeAudio,
            },
            'master service tone/ ringback tone' => {
                product_type    => RPS::File::Sale::TYPE_TRACK,
                format_type     => RPS::File::Sale::FORMAT_STREAM,
                media_type      => RPS::DB::Item::MediaType::kMediaTypeAudio,
            },
        },
    },
    'tethered download (ringtone)' => {
        'ringtone' => {
            'audio album' => {
                product_type    => RPS::File::Sale::TYPE_TRACK,
                format_type     => RPS::File::Sale::FORMAT_TETHERED,
                media_type      => RPS::DB::Item::MediaType::kMediaTypeAudio,
            },
        },
    },
    'tethered download (track)' => {
        'track' => {
            'audio album' => {
                product_type    => RPS::File::Sale::TYPE_TRACK,
                format_type     => RPS::File::Sale::FORMAT_TETHERED,
                media_type      => RPS::DB::Item::MediaType::kMediaTypeAudio,
            },
        },
    },
    'tethered download (voice tone)' => {
        'ringback' => {
            'audio album' => {
                product_type    => RPS::File::Sale::TYPE_TRACK,
                format_type     => RPS::File::Sale::FORMAT_TETHERED,
                media_type      => RPS::DB::Item::MediaType::kMediaTypeAudio,
            },
        },
    },
    'track downloads' => {
        'track' => {
            'audio album' => {
                exceptions      => ['aspiro', 'deezer', 'emusic', 'groove mobile', 'jamster', 'spotify', 't mobile', '24-7'],
                product_type    => RPS::File::Sale::TYPE_TRACK,
                format_type     => RPS::File::Sale::FORMAT_DOWNLOAD,
                media_type      => RPS::DB::Item::MediaType::kMediaTypeAudio,
            },
            'audio video bundle' => {
                exceptions      => ['aspiro', 'deezer', 'emusic', 'groove mobile', 'jamster', 'spotify', 't mobile', '24-7'],
                product_type    => RPS::File::Sale::TYPE_TRACK,
                format_type     => RPS::File::Sale::FORMAT_DOWNLOAD,
                media_type      => RPS::DB::Item::MediaType::kMediaTypeAudio,
            },
            'master service tone/ ringback tone' => {
                exceptions      => ['groove mobile'],
                product_type    => RPS::File::Sale::TYPE_TRACK,
                format_type     => RPS::File::Sale::FORMAT_RINGTONE,
                media_type      => RPS::DB::Item::MediaType::kMediaTypeAudio,
            },
        },
    },
);
    
sub _getServiceFormat
{
    my($self, $retailer, $salesType, $assetType, $productType) = @_;
 
    my $productAttributes = $gSaleAssetProductType{lc($salesType)}{lc($assetType)}{lc ($productType)};
    if (!$productAttributes)
    {
        return $self->SUPER::_getServiceFormat($retailer, $salesType, $assetType, $productType);
    }

    if ($productAttributes->{exceptions})
    {
        foreach my $exception (@{$productAttributes->{exceptions}})
        {
            if ($retailer =~ m/$exception/i)
            {
                return $self->SUPER::_getServiceFormat($retailer, $salesType, $assetType, $productType);
            }
        }
    }


    my $product_type = $productAttributes->{product_type};
    my $format_type  = $productAttributes->{format_type};
    my $media_type   = $productAttributes->{media_type};

    if (defined($productAttributes->{check_isrc}))
    {
        if ($self->_getByFieldName('isrc'))
        {
            $product_type = RPS::File::Sale::TYPE_TRACK;
        }
        else
        {
            $product_type = RPS::File::Sale::TYPE_ALBUM;
        }
    }

    # strip all the awesome junk they add to the retailer name (country has already been stripped)
    my @baggage = ('a la carte',
                   'ad supported',
                   'download',
                   'stream',
                   'tethered',
                   'streaming',
                   'subscription',
                   'interactive',
                   'non-interactive',
                   'retail sales');
    foreach my $bag (@baggage)
    {
        $retailer = $1 . $2 if ($retailer =~ m/(.*) $bag( .*|$)/i);
    }
                   
    if( $retailer =~ /^soundexchange/i )
    {
		return $self->handleError( "Cannot process $retailer", RPS::DB::Item::SaleImportError::kErrorNonqualifying ); 
    }

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

    return($service_id, $format_type, $product_type, $media_type);
}

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