package RPS::Import::RedDigital2;

use strict;

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

my %gConfigChannelMap = (
    'digital audio bundle' => {
        'online download' => {
            product_type => RPS::File::Sale::TYPE_ALBUM,
            format_type  => RPS::File::Sale::FORMAT_DOWNLOAD,
            media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'download' => {
            product_type => RPS::File::Sale::TYPE_ALBUM,
            format_type  => RPS::File::Sale::FORMAT_DOWNLOAD,
            media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'stream premium' => {
            product_type => RPS::File::Sale::TYPE_ALBUM,
            format_type  => RPS::File::Sale::FORMAT_STREAM,
            media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'stream( |-)ad supported' => { #FB11447
            product_type => RPS::File::Sale::TYPE_ALBUM,
            format_type  => RPS::File::Sale::FORMAT_STREAM,
            media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
    },
    'digital audio extended play' => {
        '(online|mobile) download' => {
            product_type => RPS::File::Sale::TYPE_ALBUM,
            format_type  => RPS::File::Sale::FORMAT_DOWNLOAD,
            media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'download' => {
            product_type => RPS::File::Sale::TYPE_ALBUM,
            format_type  => RPS::File::Sale::FORMAT_DOWNLOAD,
            media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'other' => {
            product_type => RPS::File::Sale::TYPE_ALBUM,
            format_type  => RPS::File::Sale::FORMAT_STREAM,
            media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'stream premium' => {
            product_type => RPS::File::Sale::TYPE_ALBUM,
            format_type  => RPS::File::Sale::FORMAT_STREAM,
            media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
    },
    'digital audio longplay' => {
        '(online|mobile) download' => {
            product_type => RPS::File::Sale::TYPE_ALBUM,
            format_type  => RPS::File::Sale::FORMAT_DOWNLOAD,
            media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'download' => {
            product_type => RPS::File::Sale::TYPE_ALBUM,
            format_type  => RPS::File::Sale::FORMAT_DOWNLOAD,
            media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'multi-platform download' => {
            product_type => RPS::File::Sale::TYPE_ALBUM,
            format_type  => RPS::File::Sale::FORMAT_DUALDOWNLOAD,
            media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'kiosk\/jukebox' => {
            product_type => RPS::File::Sale::TYPE_ALBUM,
            format_type  => RPS::File::Sale::FORMAT_JUKEBOX,
            media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'online subscription' => {
            product_type => RPS::File::Sale::TYPE_ALBUM,
            format_type  => RPS::File::Sale::FORMAT_STREAM,
            media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'other' => {
            product_type => RPS::File::Sale::TYPE_ALBUM,
            format_type  => RPS::File::Sale::FORMAT_STREAM,
            media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'stream premium' => {
            product_type => RPS::File::Sale::TYPE_ALBUM,
            format_type  => RPS::File::Sale::FORMAT_STREAM,
            media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'stream( |-)ad supported' => { #FB11447
            product_type => RPS::File::Sale::TYPE_ALBUM,
            format_type  => RPS::File::Sale::FORMAT_STREAM,
            media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
    },
    'digital audio track' => {
        '(online|mobile) download' => {
            product_type => RPS::File::Sale::TYPE_TRACK,
            format_type  => RPS::File::Sale::FORMAT_DOWNLOAD,
            media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'download' => {
            product_type => RPS::File::Sale::TYPE_TRACK,
            format_type  => RPS::File::Sale::FORMAT_DOWNLOAD,
            media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'locker' => {
            product_type => RPS::File::Sale::TYPE_TRACK,
            format_type  => RPS::File::Sale::FORMAT_STREAM,
            media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        '(multi-platform|online|mobile) subscription' => {
            product_type => RPS::File::Sale::TYPE_TRACK,
            format_type  => RPS::File::Sale::FORMAT_STREAM,
            media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'kiosk\/jukebox' => {
            product_type => RPS::File::Sale::TYPE_ALBUM,
            format_type  => RPS::File::Sale::FORMAT_JUKEBOX,
            media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'multi-platform download' => {
            product_type => RPS::File::Sale::TYPE_ALBUM,
            format_type  => RPS::File::Sale::FORMAT_DUALDOWNLOAD,
            media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'other' => {
            product_type => RPS::File::Sale::TYPE_TRACK,
            format_type  => RPS::File::Sale::FORMAT_STREAM,
            media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'stream( |-)ad supported' => {
            product_type => RPS::File::Sale::TYPE_TRACK,
            format_type  => RPS::File::Sale::FORMAT_STREAM,
            media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'stream premium' => {
            product_type => RPS::File::Sale::TYPE_TRACK,
            format_type  => RPS::File::Sale::FORMAT_STREAM,
            media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
    },
    'digital combo bundle' => {
        'download' => {
            product_type => RPS::File::Sale::TYPE_ALBUM,
            format_type  => RPS::File::Sale::FORMAT_DOWNLOAD,
            media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
    },
    'digital combo longplay' => {
        'online download' => {
            product_type => RPS::File::Sale::TYPE_ALBUM,
            format_type  => RPS::File::Sale::FORMAT_DOWNLOAD,
            media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'download' => {
            product_type => RPS::File::Sale::TYPE_ALBUM,
            format_type  => RPS::File::Sale::FORMAT_DOWNLOAD,
            media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
    },
    'digital video longform' => {
        'online download' => {
            product_type => RPS::File::Sale::TYPE_ALBUM,
            format_type  => RPS::File::Sale::FORMAT_DOWNLOAD,
            media_type   => RPS::DB::Item::MediaType::kMediaTypeVideo,
        },
        'download' => {
            product_type => RPS::File::Sale::TYPE_ALBUM,
            format_type  => RPS::File::Sale::FORMAT_DOWNLOAD,
            media_type   => RPS::DB::Item::MediaType::kMediaTypeVideo,
        },
        'stream premium' => {
            product_type => RPS::File::Sale::TYPE_ALBUM,
            format_type  => RPS::File::Sale::FORMAT_STREAM,
            media_type   => RPS::DB::Item::MediaType::kMediaTypeVideo,
        },
    },
    'digital video track' => {
        '(locker|online subscription|stream premium)' => {
            product_type => RPS::File::Sale::TYPE_TRACK,
            format_type  => RPS::File::Sale::FORMAT_STREAM,
            media_type   => RPS::DB::Item::MediaType::kMediaTypeVideo,
        },
        'online download' => {
            product_type => RPS::File::Sale::TYPE_TRACK,
            format_type  => RPS::File::Sale::FORMAT_DOWNLOAD,
            media_type   => RPS::DB::Item::MediaType::kMediaTypeVideo,
        },
        'other' => {
            product_type => RPS::File::Sale::TYPE_TRACK,
            format_type  => RPS::File::Sale::FORMAT_DOWNLOAD,
            media_type   => RPS::DB::Item::MediaType::kMediaTypeVideo,
        },
        'download' => {
            product_type => RPS::File::Sale::TYPE_TRACK,
            format_type  => RPS::File::Sale::FORMAT_DOWNLOAD,
            media_type   => RPS::DB::Item::MediaType::kMediaTypeVideo,
        },
        'stream( |-)ad supported' => {
            product_type => RPS::File::Sale::TYPE_TRACK,
            format_type  => RPS::File::Sale::FORMAT_STREAM,
            media_type   => RPS::DB::Item::MediaType::kMediaTypeVideo,
        },
        'stream premium' => {
            product_type => RPS::File::Sale::TYPE_TRACK,
            format_type  => RPS::File::Sale::FORMAT_STREAM,
            media_type   => RPS::DB::Item::MediaType::kMediaTypeVideo,
        },
    },
    'mastertone' => {
        '(online|mobile) download' => {
            product_type => RPS::File::Sale::TYPE_TRACK,
            format_type  => RPS::File::Sale::FORMAT_RINGTONE,
            media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'mobile subscription' => {
            product_type => RPS::File::Sale::TYPE_TRACK,
            format_type  => RPS::File::Sale::FORMAT_STREAM,
            media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'download' => {
            product_type => RPS::File::Sale::TYPE_TRACK,
            format_type  => RPS::File::Sale::FORMAT_RINGTONE,
            media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'other' => {
            product_type => RPS::File::Sale::TYPE_TRACK,
            format_type  => RPS::File::Sale::FORMAT_STREAM,
            media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'stream premium' => {
            product_type => RPS::File::Sale::TYPE_TRACK,
            format_type  => RPS::File::Sale::FORMAT_STREAM,
            media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
    },
    'ringback tone' => {
        'download' => {
            product_type => RPS::File::Sale::TYPE_TRACK,
            format_type  => RPS::File::Sale::FORMAT_RINGTONE,
            media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'mobile download' => {
            product_type => RPS::File::Sale::TYPE_TRACK,
            format_type  => RPS::File::Sale::FORMAT_RINGTONE,
            media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'mobile subscription' => {
            product_type => RPS::File::Sale::TYPE_TRACK,
            format_type  => RPS::File::Sale::FORMAT_STREAM,
            media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'other' => {
            product_type => RPS::File::Sale::TYPE_TRACK,
            format_type  => RPS::File::Sale::FORMAT_STREAM,
            media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'stream premium' => {
            product_type => RPS::File::Sale::TYPE_TRACK,
            format_type  => RPS::File::Sale::FORMAT_STREAM,
            media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
    },
    'digital combo ep' => {
        'download' => {
            product_type => RPS::File::Sale::TYPE_ALBUM,
            format_type  => RPS::File::Sale::FORMAT_DOWNLOAD,
            media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
    },
    'website - external' => {
        'stream ad supported' => {
            product_type => RPS::File::Sale::TYPE_TRACK,
            format_type  => RPS::File::Sale::FORMAT_STREAM,
            media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'other' => {
            product_type => RPS::File::Sale::TYPE_TRACK,
            format_type  => RPS::File::Sale::FORMAT_STREAM,
            media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
    },
);

sub _getMappings {
    my $self = shift;
    my $config  = shift;
    my $channel = shift;
    foreach my $_config (keys %gConfigChannelMap)
    {
        next if( $config !~ /^$_config$/i );

        foreach my $_channel (keys %{$gConfigChannelMap{$_config}})
        {
            next if( $channel !~ /^$_channel/i );

            my $productType = $gConfigChannelMap{$_config}{$_channel}->{product_type};
            my $formatType  = $gConfigChannelMap{$_config}{$_channel}->{format_type};
            my $mediaType   = $gConfigChannelMap{$_config}{$_channel}->{media_type};

            # Check if we need to override the format type based on service
            my $serviceName = $self->_getByFieldName('serviceID');
            my $serviceID = $self->getServiceID($serviceName) || $RPS::Import::ServiceMap::SERVICE_ALIASES{ lc $serviceName };

            # treat Pandora "Stream Ad Supported" or all SoundExchnage sales as PI (FB19829)
            if(($serviceID == Client::Service::DSP_PANDORA && 'stream ad supported' =~ /^$_channel$/i) ||
                $serviceID == Client::Service::DSP_SOUNDEXCHANGE )
            {
                $formatType = RPS::File::Sale::FORMAT_PERFORMANCE;
            }

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

    }
    return(undef,undef,undef);
}

sub _processLine {
    my $self = shift;

    my $config  = $self->_getByFieldName('productType'); # CONFIGURATION
    my $channel = $self->_getByFieldName('formatType');  # DISTRIBUTION CHANNEL

    ( $self->{_productType}, $self->{_formatType}, $self->{_mediaType} ) =
        $self->_getMappings( $config, $channel );

    return $self->SUPER::_processLine(@_);
}

sub _fieldMap {
    my $self = shift;

    my %fieldMap =
    (
        13 =>
        {
            serviceID        => 'A',
            dateBegin        => 'K',
            dateEnd          => 'K',
            labelName        => 'B',
            formatType       => 'L', # DISTRIBUTION CHANNEL
            artistName       => 'C',
            isrc             => 'H',
            trackName        => 'G',
            albumName        => 'D',
            units            => 'M',
            price            => 'N',
            productType      => 'E', # CONFIGURATION
        },
    );

    return $fieldMap{$self->version};
};


sub countryCode {

    my $self = shift;
    
    my $countryCode = 'US';

    if ($self->_fieldMap()->{countryCode})
    {
        $countryCode = $self->SUPER::countryCode();
    }

    return $countryCode;
}

sub currencyCode { 'USD' }

sub _headerIdentifier { ( dateBegin => 'SALES PERIOD' ) }

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

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

    return $self->_getDates( date_begin => $startDate );
}

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

    # The 'sign' of the units is driven by the price.
    # If the price is negative, we'll store negative units,
    # regardless of whether the units were positive or negative
    # in the sale file.  Accordingly, the unit price is always
    # positive (see unitPrice()).  This ensure that the returns
    # are recorded correctly.
    #
    if( defined($price) )
    {
        if( $price == 0 )
        {
            return $units;  # report units if price is 0
        }
        elsif( $units == 0 && $price != 0 )
        {
            $units = 1;  # if units are 0 and price is not, we make up a unit
        }

        # Make sure the sign of the units matches the sign of the revenue
        #
        if( $price < 0 )
        {
            $units = abs($units) * -1;  # negative revenue --> negative units
        }
        else
        {
            $units = abs($units);  # positive revenue --> positive units
        }
        return $units
    }

    return $units;
}

sub free {
    my $self = shift;
    my $units = $self->_getByFieldName('units');
    my $price = $self->_getByFieldName('price');
    return ( 0 == $price && $units ) ? 1 : 0;
}

sub _isValidSaleRecord {
	my $self = shift;

     if( defined($self->units) && ($self->trackName || $self->albumName) ) {
         return 1;
     } else {
#         print STDERR "Not a valid sale\n";
         return 0;
     }
}

# Unit price is always positive; the revenue sign is determined by the units, above
#
sub unitPrice { abs( shift->SUPER::unitPrice ) }

sub productType {
    my $self = shift;
    return $self->{_productType};
}

sub formatType {
    my $self = shift;
    return $self->{_formatType};
}

sub mediaType {
    my $self = shift;
    return $self->{_mediaType};
}

sub serviceID
{
    my $self = shift;

    my $serviceID;

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

    if (!$serviceID)
    {
        return $self->handleError("Unknown service: $serviceName", RPS::DB::Item::SaleImportError::kErrorService);
    }
    else
    {
        return $serviceID;
    }
}

sub artistName
{
    my $self = shift;

    my $artistName = $self->SUPER::artistName();
    
    if( defined $self->_unverifiedFieldMap && exists $self->_unverifiedFieldMap()->{trackArtist} )
    {
        my $trackArtist = $self->_getByFieldName('trackArtist');
        $artistName = $trackArtist if $trackArtist;
    }

    return $artistName;
}


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