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,
            },
            'high quality 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.
###
