package RPS::Import::Repost::v1;

use strict;
use warnings;

use lib '/app/tools/rps/lib';
use RPS::Import::ServiceMap;

use Date::Calc qw(Days_in_Month);

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

sub physical { 0 }

sub _fieldMapExtended {
    {
        digital => {
            option1 => {
                serviceID    => 'H',
                countryCode  => 'I',
                dateBegin    => 'A',
                dateEnd      => 'A',
                formatType   => 'J',
                artistName   => 'C',
                upc          => 'F',
                albumName    => 'D',
                isrc         => 'G',
                trackName    => 'E',
                units        => 'K',
                currencyCode => 'L',
                price        => 'L',
            },
        },
    };
}

sub _unverifiedFieldMapExtended {
    {
        digital => {
            option1 => {
                _partner => 'H',
            },
        },
    };
}

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

sub productType  { RPS::File::Sale::TYPE_TRACK }
sub currencyCode { 'USD' }

sub mediaType { RPS::DB::Item::MediaType::kMediaTypeAudio }

sub serviceID {
    my $self = shift;

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

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

sub formatType {
    my $self = shift;

    my $format = $self->_getByFieldName('formatType');
    my $partner = $self->_getByFieldName('_partner');

    return RPS::File::Sale::FORMAT_DOWNLOAD    if ( $format =~ /download$/i );
    return RPS::File::Sale::FORMAT_PERFORMANCE if ( $format =~ /^radio$/i );
    return RPS::File::Sale::FORMAT_PERFORMANCE if ( $partner =~ /^Sound Exchange$/i && $format =~ /^Unknown Stream$/i );
    return RPS::File::Sale::FORMAT_STREAM      if ( $partner !~ /^Sound Exchange$/i && $format =~ /^Unknown Stream$/i );
    return RPS::File::Sale::FORMAT_STREAM      if ( $format =~ /(?:views|stream)/i );
    return RPS::File::Sale::FORMAT_RINGTONE    if ( $format =~ /^ringtone$/i );

    $self->fail("Unable to determine format type from '$format'");
}

sub saleDates {
    my $self = shift;

    my $db = $self->_getByFieldName('dateBegin');
    my $de = $self->_getByFieldName('dateEnd');
    my ($startDate, $endDate);

    $startDate = sprintf( "%04d-%02d-%02d", $1, $2, 1 ) if ($db =~ /^(\d{4})-(\d{2})$/);
    $endDate = sprintf( "%04d-%02d-%02d", $1, $2, Days_in_Month($1, $2) ) if ($de =~ /^(\d{4})-(\d{2})$/);

    return ( $startDate, $endDate ) if ($startDate && $endDate);

    $self->fail("Unable to determine sale dates from '$db - $de'.");
}

sub _isValidSaleRecord {
    my $self = shift;

    return $self->units || $self->price;
}


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


1;
