package RPS::Import::Universal::v77;

use strict;
use warnings;

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

use parent qw/RPS::Import::MapFaceBase RPS::Import::ImporterMixed/;

sub physical { 0 }

sub _fieldMapExtended {
    {
        digital => {
            option1 => {
                labelName   => 'A',
                serviceID   => 'I',
                countryCode => 'C',
                dateBegin   => 'B',
                productType => 'I',
                formatType  => 'J',
                artistName  => 'D',
                upc         => 'E',
                albumName   => 'F',
                isrc        => 'G',
                trackName   => 'H',
                units       => 'L',
                price       => 'R',
                mediaType   => 'I',
            }
        }
    }
}


sub _unverifiedFieldMapExtended {{}}

sub _headerIdentifierExtended {
    {
        digital => {
            option1 => { upc => 'UPC' }
        }
    }
}

my %productMediaTypes = (
    'audio cloud services - subscr' => {
        product_type => RPS::File::Sale::TYPE_TRACK,
        media_type => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'audio stream true up' => {
        product_type => RPS::File::Sale::TYPE_TRACK,
        media_type => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'audio subscription true up' => {
        product_type => RPS::File::Sale::TYPE_TRACK,
        media_type => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'audio track stream portable' => {
        product_type => RPS::File::Sale::TYPE_TRACK,
        media_type => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'audio track stream portable - subscr' => {
        product_type => RPS::File::Sale::TYPE_TRACK,
        media_type => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'audio track stream webcast' => {
        product_type => RPS::File::Sale::TYPE_TRACK,
        media_type => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'audio track stream webcast - subscr' => {
        product_type => RPS::File::Sale::TYPE_TRACK,
        media_type => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'audio track stream webcast portable' => {
        product_type => RPS::File::Sale::TYPE_TRACK,
        media_type => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'audio track stream webcast portable - su' => {
        product_type => RPS::File::Sale::TYPE_TRACK,
        media_type => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'digital allocations streams (audio)' => {
        product_type => RPS::File::Sale::TYPE_TRACK,
        media_type => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'digital aud track stream -subscr ltdcat' => {
        product_type => RPS::File::Sale::TYPE_TRACK,
        media_type => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'digital online aud album permanent' => {
        product_type => RPS::File::Sale::TYPE_ALBUM,
        media_type => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'digital online aud track permanent' => {
        product_type => RPS::File::Sale::TYPE_TRACK,
        media_type => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'digital online aud track stream' => {
        product_type => RPS::File::Sale::TYPE_TRACK,
        media_type => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'digital online aud track stream - subscr' => {
        product_type => RPS::File::Sale::TYPE_TRACK,
        media_type => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'digital online vid track permanent' => {
        product_type => RPS::File::Sale::TYPE_TRACK,
        media_type => RPS::DB::Item::MediaType::kMediaTypeVideo,
    },
    'digital online vid track stream' => {
        product_type => RPS::File::Sale::TYPE_TRACK,
        media_type => RPS::DB::Item::MediaType::kMediaTypeVideo,
    },
    'fitness business use / gym use' => {
        product_type => RPS::File::Sale::TYPE_TRACK,
        media_type => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'fitness in app use' => {
        product_type => RPS::File::Sale::TYPE_TRACK,
        media_type => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'fitness on device / hardware use' => {
        product_type => RPS::File::Sale::TYPE_TRACK,
        media_type => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'user generated content stream - subscr' => {
        product_type => RPS::File::Sale::TYPE_TRACK,
        media_type => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'user generated content stream track' => {
        product_type => RPS::File::Sale::TYPE_TRACK,
        media_type => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'user generated content stream vid subscr' => {
        product_type => RPS::File::Sale::TYPE_TRACK,
        media_type => RPS::DB::Item::MediaType::kMediaTypeVideo,
    },
    'user generated content stream video' => {
        product_type => RPS::File::Sale::TYPE_TRACK,
        media_type => RPS::DB::Item::MediaType::kMediaTypeVideo,
    },
    'video cloud services - subscr' => {
        product_type => RPS::File::Sale::TYPE_TRACK,
        media_type => RPS::DB::Item::MediaType::kMediaTypeVideo,
    },
    'video stream video portable - subscr' => {
        product_type => RPS::File::Sale::TYPE_TRACK,
        media_type => RPS::DB::Item::MediaType::kMediaTypeVideo,
    },
);

sub currencyCode { 'EUR' }

sub serviceID {
    my $self = shift;

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

    my @parts = map { s/^\s+|\s+$//gr } split(/\//, $service);
    my $serviceName = pop @parts;

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

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


sub countryCode {
    my $self = shift;

    my $code = $self->_getByFieldName('countryCode') || '' ;
    return 'AT' if $code =~ /.*sterreich\/WB/i;
    return 'DE' if $code =~ /Deutschland/i;
    return 'CH' if $code =~ /Schweiz/i;

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

my %months = (
    jan => 1, feb => 2, mar => 3, apr => 4, may => 5, jun => 6,
    jul => 7, aug => 8, sep => 9, oct => 10, nov => 11, dec => 12,
);

sub saleDates {
    my $self = shift;

    # MMM YYYY
    my $period = $self->_getByFieldName('dateBegin') || '';

    if ( my ($m, $y) = $period =~ /([a-z]{3})\s*(\d{4})/i ) {
        return $self->_getDates(
            date_begin => sprintf( "%04d-%02d-%02d", $y, $months{lc $m}, 1 ),
            date_end   => sprintf( "%04d-%02d-%02d", $y, $months{lc $m}, Days_in_Month( $y, $months{lc $m} ) ),
        );
    }

    $self->fail( "Unable to determine date from '$period'." );
}

sub productType {
    my $self = shift;

    my $type = $self->_getByFieldName('productType') || '';
    if ( exists $productMediaTypes{lc $type} ) {
        return $productMediaTypes{lc $type}{product_type};
    }

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

sub formatType {
    my $self = shift;

    my $type = $self->_getByFieldName('formatType') || '';
    if ( $type =~ /^(?:Streaming and Subscriptions|Digital Other Income)$/i ) {
        return RPS::File::Sale::FORMAT_STREAM;
    } elsif ( $type =~ /^Digital Downloads$/i ) {
        return RPS::File::Sale::FORMAT_DOWNLOAD;
    }

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

sub mediaType {
    my $self = shift;

    my $type = $self->_getByFieldName('mediaType') || '';
    if ( exists $productMediaTypes{lc $type} ) {
        return $productMediaTypes{lc $type}{media_type};
    }

    return $self->handleError( "Unknown media type: $type", RPS::DB::Item::SaleImportError::kErrorMediaType );
}

sub price     { abs( shift->_getByFieldName('price') || 0 ) }
sub unitPrice { abs shift->SUPER::unitPrice }
sub units {
    my $self = shift;

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

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

    return $units;
}

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


1;
