package RPS::Import::E1Distribution::v1;

use strict;

use lib '/app/tools/rps/lib';
use RPS::Import::ServiceMap;
use Date::Calc qw(Days_in_Month);

use base qw/RPS::Import::MapFaceBase RPS::Import::Importer/;

sub _fieldMap {
    {
        labelName    => 'A1',
        serviceID    => 'B',
        countryCode  => 'A',
        dateBegin    => 'C1',
        dateEnd      => 'C1',
        productType  => 'H',
        formatType   => 'H',
        artistName   => 'G',
        upc          => 'D',
        albumName    => 'F',
        isrc         => 'D',
        trackName    => 'F',
        units        => 'I',
        price        => 'J',
    }
}

sub _unverifiedFieldMap { {} };
sub _headerIdentifier { ( upc => 'UPC / ISRC #' ) }

sub currencyCode { 'USD' };
sub mediaType { RPS::DB::Item::MediaType::kMediaTypeAudio; }

my %productFormatMap = (
    'album burn' => {
        format       => RPS::File::Sale::FORMAT_DOWNLOAD,
        product_type => RPS::File::Sale::TYPE_ALBUM,
    },
    'album download' => {
        format       => RPS::File::Sale::FORMAT_DOWNLOAD,
        product_type => RPS::File::Sale::TYPE_ALBUM,
    },
    'album download subscription' => {
        format       => RPS::File::Sale::FORMAT_VPD,
        product_type => RPS::File::Sale::TYPE_ALBUM,
    },
    'album download-subscription' => {
        format       => RPS::File::Sale::FORMAT_VPD,
        product_type => RPS::File::Sale::TYPE_ALBUM,
    },
    'album high quality playlist/album' => {
        format       => RPS::File::Sale::FORMAT_DOWNLOADPREMIUM,
        product_type => RPS::File::Sale::TYPE_ALBUM,
    },
    'album teth download' => {
        format       => RPS::File::Sale::FORMAT_TETHERED,
        product_type => RPS::File::Sale::TYPE_ALBUM,
    },
    'track teth download' => {
        format       => RPS::File::Sale::FORMAT_TETHERED,
        product_type => RPS::File::Sale::TYPE_TRACK,
    },
    'album stream' => {
        format       => RPS::File::Sale::FORMAT_STREAM,
        product_type => RPS::File::Sale::TYPE_ALBUM,
    },
    'album stream cloud' => {
        format       => RPS::File::Sale::FORMAT_STREAM,
        product_type => RPS::File::Sale::TYPE_ALBUM,
    },
    'track audio/video stream' => {
        format       => RPS::File::Sale::FORMAT_STREAM,
        product_type => RPS::File::Sale::TYPE_TRACK,
    },
    'track burn' => {
        format       => RPS::File::Sale::FORMAT_DOWNLOAD,
        product_type => RPS::File::Sale::TYPE_TRACK,
    },
    'track download subscription' => {
        format       => RPS::File::Sale::FORMAT_VPD,
        product_type => RPS::File::Sale::TYPE_TRACK,
    },
    'track download-subscription' => {
        format       => RPS::File::Sale::FORMAT_VPD,
        product_type => RPS::File::Sale::TYPE_TRACK,
    },
    'track download' => {
        format       => RPS::File::Sale::FORMAT_DOWNLOAD,
        product_type => RPS::File::Sale::TYPE_TRACK,
    },
    'track high quality song' => {
        format       => RPS::File::Sale::FORMAT_DOWNLOADPREMIUM,
        product_type => RPS::File::Sale::TYPE_TRACK,
    },
    'track stream' => {
        format       => RPS::File::Sale::FORMAT_STREAM,
        product_type => RPS::File::Sale::TYPE_TRACK,
    },
    'track stream cloud' => {
        format       => RPS::File::Sale::FORMAT_STREAM,
        product_type => RPS::File::Sale::TYPE_TRACK,
    },
    'track stream (hi-res)' => {
        format       => RPS::File::Sale::FORMAT_STREAM,
        product_type => RPS::File::Sale::TYPE_TRACK,
    },
    'track performance' => {
        format       => RPS::File::Sale::FORMAT_PERFORMANCE,
        product_type => RPS::File::Sale::TYPE_TRACK,
    },
    'track subscription stream' => {
        format       => RPS::File::Sale::FORMAT_STREAM,
        product_type => RPS::File::Sale::TYPE_TRACK,
    },
    'track internet radio' => {
        format       => RPS::File::Sale::FORMAT_STREAM,
        product_type => RPS::File::Sale::TYPE_TRACK,
    },
    'track background music' => {
        format       => RPS::File::Sale::FORMAT_BACKGROUNDMUSIC,
        product_type => RPS::File::Sale::TYPE_TRACK,
    },
    'track jukebox' => {
        format       => RPS::File::Sale::FORMAT_JUKEBOX,
        product_type => RPS::File::Sale::TYPE_TRACK,
    },
    'track satellite radio - peformance' => {
        format       => RPS::File::Sale::FORMAT_PERFORMANCE,
        product_type => RPS::File::Sale::TYPE_TRACK,
    },
    'track performance' => {
        format       => RPS::File::Sale::FORMAT_PERFORMANCE,
        product_type => RPS::File::Sale::TYPE_TRACK,
    },
    'track audio ad support/stream' => {
        format       => RPS::File::Sale::FORMAT_STREAM,
        product_type => RPS::File::Sale::TYPE_TRACK,
    }
);

sub _getMapping {
    my $self = shift;

    my $type = $self->_getByFieldName("productType") || "";
    my $type = lc($type);

    if ( exists($productFormatMap{$type}) ) {
        return ($productFormatMap{$type}{format}, $productFormatMap{$type}{product_type});
    }
}

sub serviceID {
    my $self    = shift;

    my $service = $self->_getByFieldName('serviceID') || "Entertainment One Distribution";

    return Client::Service::DSP_IHEARTRADIO if $service =~ /^iHeart Radio/i;
    return Client::Service::DSP_SIRIUS_XM   if $service =~ /^sirius xm/i;

    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 labelName {
    my $self = shift;

    my $name = $self->_getByFieldName("labelName") || "";
    $name =~ s/^.+?-\s*?\b(.+)$/$1/;
    return $name;
}

sub upc {
    my $self = shift;

    my $upc = $self->_getByFieldName('upc') || "";
    my $type = $self->_getMapping;

    return $upc if ($type eq RPS::File::Sale::TYPE_ALBUM);
}

sub isrc {
    my $self = shift;

    my $isrc = $self->_getByFieldName('isrc') || "";
    my $type = $self->_getMapping;

    return $isrc if ($type eq RPS::File::Sale::TYPE_TRACK);
}

sub albumName {
    my $self = shift;

    my $name = $self->_getByFieldName('albumName') || "";
    my $type = $self->_getMapping;

    return $name if ($type eq RPS::File::Sale::TYPE_ALBUM);
}

sub trackName {
    my $self = shift;

    my $name = $self->_getByFieldName('trackName') || "";
    my $type = $self->_getMapping;

    $name =~ s/^.+?-\s*?\b(.+)$/$1/ if ($type eq RPS::File::Sale::TYPE_TRACK);
    return $name if ($type eq RPS::File::Sale::TYPE_TRACK);
}

sub saleDates {
    my $self = shift;

    my $date = $self->_getByFieldName('dateBegin') || "";

    if ( $date =~ /^Fiscal Period: (\d{4})(\d{2}) thru: (\d{4})(\d{2})/i ) {
        my $date_begin = sprintf( "%04d-%02d-01", $1, $2 );
        my $date_end = sprintf( "%04d-%02d-%02d", $3, $4, Days_in_Month( $3, $4));
        return ($date_begin, $date_end);
    }
    $self->fail("Cannot determine sale dates from '$date'");
}

sub productType {
    my $self = shift;

    my $type = $self->_getMapping;
    return $type if $type;

    $self->handleError( "Unknown product type: '$type'", RPS::DB::Item::SaleImportError::kErrorProductType );
}

sub formatType {
    my $self = shift;

    my $type = lc($self->_getByFieldName('formatType')) || "";
    my $service = $self->_getByFieldName('serviceID') || "";

    if ($type =~  /track internet radio/i && $service =~ /pandora(?:\ssubscription|plus)?/i){
        return RPS::File::Sale::FORMAT_PERFORMANCE;
    }

    ($type) = $self->_getMapping;
    return $type if $type;

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

sub units {
    my $self = shift;

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

    $units =~ s/[,.]//g;

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

    return $units;
}

sub price {
    my $self = shift;

    my $price = $self->_getByFieldName("price") || 0;
    $price =~ s/\.0+$//g;
    $price =~ s/^\$\./0./ if ($price =~ /^\$\.\d/);
    $price =~ s/[\$,]//g;
    $price = abs($price) * -1 if $price =~ s/[)(]//g;

    return $price || 0;
}

sub _mapFaceProductType { 'productType' }
sub _mapFaceServiceID   { 'serviceID' }
sub _mapFaceCountryCode { 'countryCode' }
sub _mapFaceFormatType  { 'formatType' }
sub _mapFaceMediaType   { 'mediaType' }

1;
