package RPS::Import::Redeye::v4;

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

sub _fieldMap {
    {
        dateBegin   => 'B',
        dateEnd     => 'C',
        labelName   => 'H',
        serviceID   => 'A',
        countryCode => 'D',
        productType => 'M',    # Method
        formatType  => 'N',    # Format
        upc         => 'E',
        isrc        => 'F',
        trackName   => 'K',
        albumName   => 'J',
        units       => 'O',
        price       => 'R',
    };
}

sub _unverifiedFieldMap {
    {
        trackArtist => 'L',
        albumArtist => 'I',
    };
}

sub currencyCode { 'USD' }

sub _headerIdentifier { ( dateBegin => 'Start Date' ) }

my %methodFormatMap = (
    'breakage' => {
        'track' => {
            'product' => RPS::File::Sale::TYPE_TRACK,
            'format'  => RPS::File::Sale::FORMAT_STREAM,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
    },
    'download' => {
        'album' => {
            'product' => RPS::File::Sale::TYPE_ALBUM,
            'format'  => RPS::File::Sale::FORMAT_DOWNLOAD,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'track' => {
            'product' => RPS::File::Sale::TYPE_TRACK,
            'format'  => RPS::File::Sale::FORMAT_DOWNLOAD,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'ringtone' => {
            'product' => RPS::File::Sale::TYPE_TRACK,
            'format'  => RPS::File::Sale::FORMAT_RINGTONE,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
    },
    'stream' => {
        'album' => {
            'product' => RPS::File::Sale::TYPE_ALBUM,
            'format'  => RPS::File::Sale::FORMAT_STREAM,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'performance income' => {
            'product' => RPS::File::Sale::TYPE_TRACK,
            'format'  => RPS::File::Sale::FORMAT_PERFORMANCE,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'track' => {
            'product' => RPS::File::Sale::TYPE_TRACK,
            'format'  => RPS::File::Sale::FORMAT_STREAM,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'video' => {
            'product' => RPS::File::Sale::TYPE_TRACK,
            'format'  => RPS::File::Sale::FORMAT_STREAM,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeVideo,
        },
    },
    'nrights' => {
        'performance income' => {
            'product' => RPS::File::Sale::TYPE_TRACK,
            'format'  => RPS::File::Sale::FORMAT_PERFORMANCE,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'track' => {
            'product' => RPS::File::Sale::TYPE_TRACK,
            'format'  => RPS::File::Sale::FORMAT_STREAM,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
    },
    'performance income' => {
        'track' => {
            'product' => RPS::File::Sale::TYPE_TRACK,
            'format'  => RPS::File::Sale::FORMAT_PERFORMANCE,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
    },
    'equity' => {
        'track' => {
            'product' => RPS::File::Sale::TYPE_TRACK,
            'format'  => RPS::File::Sale::FORMAT_STREAM,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
    },
    '' => {
        'track' => {
            'product' => RPS::File::Sale::TYPE_TRACK,
            'format'  => RPS::File::Sale::FORMAT_STREAM,
            'media'   => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
    },
);

sub countryCode {
    my $self = shift;
    my $name = $self->_getByFieldName('countryCode');

    # Apparently RedEye is consistently reporting incorrect Territory codes for the service Wimp.
    # Until they get their act together, we'll map the following country codes.
    # See Case 8311. (Also Case FB22138)
    $name = 'PL' if ( $name =~ /^Po$/ );
    $name = 'SE' if ( $name =~ /^Sw$/ );
    $name = 'HN' if ( $name =~ /^Ho$/ );
    $name = 'ES' if ( $name =~ /^Sp$/ );
    $name = 'IS' if ( $name =~ /^Ic$/ );
    $name = 'GW' if ( $name =~ /^Pu$/ );
    $name = 'TR' if ( $name =~ /^Tu$/ );
    $name = 'EU' if ( $name =~ /^Un$/ );
    $name = 'JM' if ( $name =~ /^Ja$/ );

    $name = 'US' if ( '' eq $name );

    return $name;
}

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

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

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

    $self->fail("Service name not defined") unless ($serviceName);

    if ( $serviceName =~ /^Beats$/i ) {
        $serviceName = "BeatsDigital";
    }

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

    $self->fail("Unable to determine service id from '$serviceName'") unless ($serviceID);

    return $serviceID;
}

sub artistName {
    my $self        = shift;
    my $trackArtist = $self->_getByFieldName('trackArtist');
    my $albumArtist = $self->_getByFieldName('albumArtist');

    return $self->productType eq RPS::File::Sale::TYPE_TRACK ? $trackArtist : $albumArtist;
}

sub mediaType {
    my $self    = shift;

    my $method  = lc $self->_getByFieldName('productType');
    my $format  = lc $self->_getByFieldName('formatType');
    my $isrc    = $self->_getByFieldName('isrc');
    my $service = $self->serviceID();
    my $upc     = $self->_getByFieldName('upc');

    if ( $method =~ /^stream$/i && $format =~ /^video$/i && $service == Client::Service::DSP_YOUTUBE ) {
        return RPS::DB::Item::MediaType::kMediaTypeAudio;    # override the methodFormatMap for stream/video
    }
    if ( $method =~ /^stream$/i && $format =~ /^track$/i && $service == Client::Service::DSP_ALIBABA ) {
        return RPS::DB::Item::MediaType::kMediaTypeAudio;    # override the methodFormatMap for stream/video
    }
    if ( $method =~ /^download$/ && !$format && ($isrc || $upc) ) {
        return RPS::DB::Item::MediaType::kMediaTypeAudio;    # override the methodFormatMap for download with no format provided. (RSD-4095, RSD-4315)
    }

    if ( exists $methodFormatMap{$method}{$format} ) {
        return $methodFormatMap{$method}{$format}{media};
    } else {
        $self->fail("Could not get media type from method '$method' format '$format'");
    }
}

sub productType {
    my $self   = shift;
    my $method = lc $self->_getByFieldName('productType');
    my $format = lc $self->_getByFieldName('formatType');
    my $isrc   = $self->_getByFieldName('isrc');
    my $upc    = $self->_getByFieldName('upc');

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

    if ( $method =~ /^download$/ && !$format && $isrc ) {
        return RPS::File::Sale::TYPE_TRACK;    # override the methodFormatMap for download with no format provided. RSD-4095
    }

    if ( $method =~ /^download$/ && !$format && !$isrc && $upc ) {
        return RPS::File::Sale::TYPE_ALBUM;    # override the methodFormatMap for download with no format provided. RSD-4315
    }

    my $_productType;
    if ( exists $methodFormatMap{$method}{$format} ) {
        my $_type = $methodFormatMap{$method}{$format}{product};

        if ( $_type eq RPS::File::Sale::TYPE_ALBUM ) {

            # Override album product if track name is present
            #
            return ( $trackName && '' ne $trackName ) ? RPS::File::Sale::TYPE_TRACK : $_type;
        } else {
            return $_type;
        }
    } else {
        $self->fail("Could not get product type from method '$method' format '$format'");
    }
}

sub formatType {
    my $self    = shift;
    my $method  = lc $self->_getByFieldName('productType');
    my $format  = lc $self->_getByFieldName('formatType');
    my $isrc    = $self->_getByFieldName('isrc');
    my $service = $self->serviceID();
    my $upc     = $self->_getByFieldName('upc');

    if ( $method =~ /^stream$/i && $format =~ /^track$/i && $service == Client::Service::DSP_ALIBABA ) {
        return RPS::File::Sale::FORMAT_STREAM;    # override default stream/track mapping
    } elsif ( $method =~ /^(?:stream|nrights)$/i && $format =~ /^track$/i && $service == Client::Service::DSP_SOUNDEXCHANGE ) {
        return RPS::File::Sale::FORMAT_PERFORMANCE;    # override default stream/track mapping
    } elsif ( $method =~ /^download$/ && !$format && ($isrc || $upc) ) {
        return RPS::File::Sale::FORMAT_DOWNLOAD;    # override the methodFormatMap for download with no format provided. (RSD-4095, RSD-4315)
    } elsif ( exists $methodFormatMap{$method}{$format} ) {
        return $methodFormatMap{$method}{$format}{format};
    } else {
        $self->fail("Could not get format type from method '$method' format '$format'");
    }
}

sub price {
    my $price = abs( shift->SUPER::price() );
    return $price;
}

sub units {
    my $self = shift;

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

    if ( $price > 0 ) {
         $units = $units ? abs($units) : 1;
    }
    elsif ( $price < 0 ) {
        $units = $units ? -1 * abs($units) : -1;
    }

    return $units;
}

sub unitPrice { abs( shift->SUPER::unitPrice ) }

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