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 qw/RPS::Import::MapFaceBase 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,
        },
        'other' => {
            product_type => RPS::File::Sale::TYPE_ALBUM,
            format_type  => RPS::File::Sale::FORMAT_DOWNLOAD,
            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,
        },
        'other' => {
            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
            #serviceProductID => 'I',
            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 trackName {
    my $self = shift;

    my $productType = $self->_getByFieldName('productType') || '';
    my $trackTitle  = $self->_getByFieldName('trackName')   || '';

    if ( !$trackTitle && $productType =~ /^digital audio track$/i ) {
        return $self->_getByFieldName('albumName') || '';
    }

    return $trackTitle;
}

sub _isValidSaleRecord {
    my $self = shift;

    if ( defined $self->units && ( $self->trackName || $self->albumName ) ) {
        return 1;
    }

    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 };

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

    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;
}

## MapFace Stuff

sub _mapFaceServiceID {
    return ('serviceID');
}

sub _mapFaceCountryCode {
    return ('countryCode');
}

sub _mapFaceProductType {
    return ('productType', 'formatType');
}

sub _mapFaceFormatType {
    return ('productType', 'formatType');
}

sub _mapFaceMediaType {
    return ('productType', 'formatType');
}

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