package RPS::Import::DDS::v4;

use strict;
use warnings;

use lib '/app/tools/rps/lib';
use Common::RSMath qw(round);

use base qw/RPS::Import::MapFaceBase RPS::Import::DDS::v3/;

sub _fieldMap {
    {
        labelName   => 'E',
        serviceID   => 'C',
        countryCode => 'D',
        dateBegin   => 'A',
        dateEnd     => 'B',
        productType => 'H',
        formatType  => 'N',
        artistName  => 'F',
        upc         => 'I',
        albumName   => 'G',
        isrc        => 'J',
        trackName   => 'H',
        units       => 'K',
        price       => 'M',
        mediaType   => 'N',
    }
}

sub _unverifiedFieldMap {
    {
        unitPrice => 'L',
        transType => 'O',
    },
}

my %formatMap = (
    'Download Tracks' => {
        format_type   => RPS::File::Sale::FORMAT_DOWNLOAD,
        product_type  => RPS::File::Sale::TYPE_TRACK,
        media_type    => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'Download Albums' => {
        format_type   => RPS::File::Sale::FORMAT_DOWNLOAD,
        product_type  => RPS::File::Sale::TYPE_ALBUM,
        media_type    => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'Ad Supported Audio Streams from Art Track Videos' => {
        format_type   => RPS::File::Sale::FORMAT_STREAM,
        product_type  => RPS::File::Sale::TYPE_TRACK,
        media_type    => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'Ad-Supported Audio Streams' => {
        format_type   => RPS::File::Sale::FORMAT_STREAM,
        product_type  => RPS::File::Sale::TYPE_TRACK,
        media_type    => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'Mid-Tier Subscription Audio Streams' => {
        format_type   => RPS::File::Sale::FORMAT_STREAM,
        product_type  => RPS::File::Sale::TYPE_TRACK,
        media_type    => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'Subscription Audio Streams' => {
        format_type   => RPS::File::Sale::FORMAT_STREAM,
        product_type  => RPS::File::Sale::TYPE_TRACK,
        media_type    => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'Unqualified Audio Streams' => {
        format_type   => RPS::File::Sale::FORMAT_STREAM,
        product_type  => RPS::File::Sale::TYPE_TRACK,
        media_type    => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'Subscription Audio Streams from Art Track Videos' => {
        format_type   => RPS::File::Sale::FORMAT_STREAM,
        product_type  => RPS::File::Sale::TYPE_TRACK,
        media_type    => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'Subscription Audio Streams from UGC' => {
        format_type   => RPS::File::Sale::FORMAT_STREAM,
        product_type  => RPS::File::Sale::TYPE_TRACK,
        media_type    => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'Ad Supported Audio Streams from UGC' => {
        format_type   => RPS::File::Sale::FORMAT_STREAM,
        product_type  => RPS::File::Sale::TYPE_TRACK,
        media_type    => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'Cloud Match Units' => {
        format_type   => RPS::File::Sale::FORMAT_STREAM,
        product_type  => RPS::File::Sale::TYPE_TRACK,
        media_type    => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'Fraudulent Streams' => {
        format_type   => RPS::File::Sale::FORMAT_STREAM,
        product_type  => RPS::File::Sale::TYPE_TRACK,
        media_type    => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'Ad-Supported Video Streaming (Direct - At Rate Card)' => {
        format_type   => RPS::File::Sale::FORMAT_STREAM,
        product_type  => RPS::File::Sale::TYPE_TRACK,
        media_type    => RPS::DB::Item::MediaType::kMediaTypeVideo,
    },
    'Ad-Supported Video Streaming (Direct - Over Rate Card)' => {
        format_type   => RPS::File::Sale::FORMAT_STREAM,
        product_type  => RPS::File::Sale::TYPE_TRACK,
        media_type    => RPS::DB::Item::MediaType::kMediaTypeVideo,
    },
    'Short-form Video User Generated Revenue' => {
        format_type   => RPS::File::Sale::FORMAT_STREAM,
        product_type  => RPS::File::Sale::TYPE_TRACK,
        media_type    => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'Subscription Video Streams from Partnered Channels' => {
        format_type   => RPS::File::Sale::FORMAT_STREAM,
        product_type  => RPS::File::Sale::TYPE_TRACK,
        media_type    => RPS::DB::Item::MediaType::kMediaTypeVideo,
    },
    'Subscription Streams from Partnered Channels (Audio Only Mode)' => {
        format_type   => RPS::File::Sale::FORMAT_STREAM,
        product_type  => RPS::File::Sale::TYPE_TRACK,
        media_type    => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'Streaming Bonus' => {
        format_type   => RPS::File::Sale::FORMAT_STREAM,
        product_type  => RPS::File::Sale::TYPE_TRACK,
        media_type    => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'Tethered Downloads' => {
        format_type   => RPS::File::Sale::FORMAT_TETHERED,
        product_type  => RPS::File::Sale::TYPE_TRACK,
        media_type    => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'Non-interactive Radio' => {
        format_type   => RPS::File::Sale::FORMAT_PERFORMANCE,
        product_type  => RPS::File::Sale::TYPE_TRACK,
        media_type    => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
);

sub _headerIdentifier { ( labelName => 'Label' ) }
sub currencyCode { 'USD' }

sub serviceID {
    my $self    = shift;
    my $service = $self->_getByFieldName('serviceID');

    if ( $service =~ /^gaana/i ) {
        return Client::Service::DSP_GAANA;
    } elsif ( $service =~ /^Tencent Music$/i  ) {
        return Client::Service::DSP_TENCENT;
    }

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

    $self->handleError( "Unknown service: '$service'.", RPS::DB::Item::SaleImportError::kErrorService );
}

sub countryCode {
    my $self = shift;

    my $code = $self->_getByFieldName('countryCode') || '';
    my $country = Common::Country->Get($code);
    return $country->alpha2 if $country;

    $self->handleError( "Unknown country: '$code'.", RPS::DB::Item::SaleImportError::kErrorCountry );
    return $code;
}

sub formatType {
    my $self   = shift;
    my $format = $self->_getByFieldName('formatType') || "";

    unless ($format) {
        $format = $self->_getByFieldName('transType') || "";
        if ($format && exists $formatMap{$format}) {
            return $formatMap{$format}{format_type};
        }
    }

    if (   $format =~ /^(as|s|cl|mt|sb|sv|av|streaming radio|streaming|stream|radio|cloud|st|sf|fs|ao|ac|uq|sn|ya|ym|xa|xm|ugr)$/i
        || $format =~ /^apple radio$/i ) {
        return RPS::File::Sale::FORMAT_STREAM;
    } elsif ( $format =~ /^(da|dt|download|ds)$/i ) {
        return RPS::File::Sale::FORMAT_DOWNLOAD;
    } elsif ( $format =~ /^(td|ta)$/i ) {
        return RPS::File::Sale::FORMAT_TETHERED;
    } elsif ( $format =~ /^(nr)$/i ) {
        return RPS::File::Sale::FORMAT_PERFORMANCE;
    } else {
        $self->fail("Unable to determine format type from '$format'");
    }
}

sub mediaType {
    my $self   = shift;
    my $format = $self->_getByFieldName('formatType') || "";

    unless ($format) {
        $format = $self->_getByFieldName('transType') || "";
        if ($format && exists $formatMap{$format}) {
            return $formatMap{$format}{media_type};
        }
    }

    if (   $format =~ /^(?:as|dt|s|td|mt|cl|ta|sb|da|ta|nr|download|streaming radio|streaming|stream|radio|cloud|st|sf|fs|ds|uq|sn|ya|ym|xa|xm|ugr)$/i
        || $format =~ /^apple radio$/i ) {
        return RPS::DB::Item::MediaType::kMediaTypeAudio;
    } elsif ( $format =~ /^av|sv|ao|ac$/i ) {
        return RPS::DB::Item::MediaType::kMediaTypeVideo;
    } else {
        $self->fail("Unable to determine media type from '$format'");
    }
}

sub units {
    my $self = shift;

    my $units = $self->_getByFieldName('units') || 0;
    my $price = $self->_getByFieldName('price') || 0;

    $units = round($units);

    return $units if ($price == 0);
    (($units < 0 && $price < 0) || ($units > 0 && $price > 0 )) ? return $units : return ($units * -1);
}

sub _mapFaceProductType { }
sub _mapFaceServiceID   { 'serviceID' }
sub _mapFaceCountryCode { 'countryCode' }
sub _mapFaceFormatType  { }
sub _mapFaceMediaType   { }

1;
