package RPS::Import::Universal::v64;

use strict;
use warnings;

use Date::Calc qw(Days_in_Month Decode_Month);

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

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

sub _fieldMap {
    {
        serviceID   => 'U',
        dateBegin   => 'L2',
        productType => 'O',
        formatType  => 'R',
        artistName  => 'L',
        upc         => 'M',
        albumName   => 'N',
        isrc        => 'O',
        trackName   => 'P',
        price       => 'Y',
        mediaType   => 'R',
    };
}

my %formatMediaMap = (
    'digital allocations streams (audio)' => {
        formatType => RPS::File::Sale::FORMAT_STREAM,
        mediaType  => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'digital allocations streams (video)' => {
        formatType => RPS::File::Sale::FORMAT_STREAM,
        mediaType  => RPS::DB::Item::MediaType::kMediaTypeVideo,
    },
    'digital allocations downloads' => {
        formatType => RPS::File::Sale::FORMAT_STREAM,
        mediaType  => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'digital allocations mobile' => {
        formatType => RPS::File::Sale::FORMAT_STREAM,
        mediaType  => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
);

sub _headerIdentifier { upc => 'UPC' }
sub countryCode       { 'US' }
sub currencyCode      { 'USD' }

sub units {
    my $self = shift;
    my $price = $self->_getByFieldName('price') || 0;
    return $price <=> 0;
}

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;

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

sub saleDates {
    my $self = shift;

    my $period = $self->_getByFieldName('dateBegin') || '';
    $period =~ /^\d?(\d{2})\.(\d{4})$/;
    my $startDate = sprintf "%04d-%02d-%02d", $2, $1, 1;
    my $endDate   = sprintf "%04d-%02d-%02d", $2, $1, Days_in_Month( $2, $1 );

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

sub productType {
    my $self = shift;
    return $self->isrc ? RPS::File::Sale::TYPE_TRACK : RPS::File::Sale::TYPE_ALBUM;
}

sub isrc {
    my $self = shift;
    my $isrc = $self->_getByFieldName('isrc') || '';
    $isrc =~ s/#//g;
    return $isrc;
}

sub formatType {
    my $self = shift;

    my $type = lc( $self->_getByFieldName('formatType') || '' );
    if ( exists $formatMediaMap{$type} ) {
        return $formatMediaMap{$type}{formatType};
    }

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

sub mediaType {
    my $self = shift;

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

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

# mapFace
sub _mapFaceServiceID {
    return ('serviceID');
}

sub _mapFaceCountryCode {
    return;
}

sub _mapFaceProductType {
    return;
}

sub _mapFaceFormatType {
    return ('formatType');
}

sub _mapFaceMediaType {
    return ('formatType');
}

sub _mapFaceCompatibleVersions {
    return ( 64 );
}

1;