package RPS::Import::Dorado::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 => {
                labelName        => 'F',
                serviceID        => 'J',
                countryCode      => 'I',
                productType      => 'B',
                formatType       => 'J',
                serviceProductID => 'D',
                clientProductID  => 'E',
                artistName       => 'G',
                upc              => 'A',
                albumName        => 'H',
                isrc             => 'B',
                trackName        => 'H',
                units            => 'K',
                price            => 'P',
                mediaType        => 'J',
            }
        }
    }
}

sub _unverifiedFieldMapExtended {
    {
        digital => {
            option1 => {
                _ean => 'C',
            }
        }
    }
}

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

sub productType  { RPS::File::Sale::TYPE_TRACK }
sub mediaType    { RPS::DB::Item::MediaType::kMediaTypeAudio }
sub currencyCode { 'EUR' }

sub serviceID {
    my $self = shift;

    my $service = lc( $self->_getByFieldName('serviceID') || '' );
    $service =~ s/\s*-.*//g;
    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 countryCode {
    my $self = shift;

    my $name = $self->_getByFieldName('countryCode') || 'DE';

    my $country = Common::Country->Get($name);
    return $country->alpha2() if $country;

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

sub saleDates {
    my $self = shift;

    my $period = $self->filename || "";

    # 78541_Napalm_Records_Handels_GmbH2023-01_streams
    if ( $period =~ /\w(\d{4})-(\d{2})_/) {
        return $self->_getDates(
            date_begin => sprintf( "%04d-%02d-%02d", $1, $2, 1 ),
            date_end   => sprintf( "%04d-%02d-%02d", $1, $2, Days_in_Month($1, $2)))
    }

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

sub formatType {
    my $self = shift;

    my $type = $self->_getByFieldName('formatType') || '';
    $type =~ s/^.*-\s*//g;

    return RPS::File::Sale::FORMAT_STREAM if $type =~ /stream/i;
    return RPS::File::Sale::FORMAT_DOWNLOAD if $type =~ /(?:bundle|track)/i;

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

sub productType {
    my $self = shift;

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

    return $type ? RPS::File::Sale::TYPE_TRACK : RPS::File::Sale::TYPE_ALBUM;
}

sub serviceProductID {
    my $self = shift;

    my $vendor = $self->_getByFieldName('serviceProductID') || '';
    my $ean    = $self->_getByFieldName('_ean') || '';

    return $ean ? $ean : $vendor;
}

sub albumName {
    my $self = shift;

    my $name = $self->_getByFieldName('albumName') || '';
    my $isrc = $self->_getByFieldName('isrc') || '';

    return $isrc ? '' : $name;
}

sub trackName {
    my $self = shift;

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

    return $isrc ? $name : '';
}

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

    return defined $self->units && defined $self->_getByFieldName('price')
        && ( $self->_getByFieldName('albumName') || $self->_getByFieldName('trackName') );
}

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

1;
