package RPS::Import::Tidal::v2;

use strict;
use warnings;

use lib '/app/tools/rps/lib';
use lib '/app/tools/data_classes/lib';

use Client::Service;
use RPS::Import::ServiceMap;

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

sub _fieldMap {
    {
        labelName    => 'D',
        serviceID    => 'F',
        countryCode  => 'E',
        dateBegin    => 'A',
        dateEnd      => 'A',
        productType  => 'H',
        formatType   => 'I',
        artistName   => 'Q',
        upc          => 'R',
        albumName    => 'O',
        isrc         => 'S',
        trackName    => 'P',
        units        => 'I',
        currencyCode => 'V',
        price        => 'U',
    },
    ;
}

sub _headerIdentifier { upc => 'upc' }

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;

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

sub countryCode {
    my $self = shift;

    my $name = $self->_getByFieldName('countryCode') || '';
    my $country = Common::Country->Get($name);
    return $country->alpha2() if $country;

    $self->fail("Unable to determine countryCode from: '$name'");
}

sub productType {
    my $self = shift;

    my $type = $self->_getByFieldName('productType') || '';
    return RPS::File::Sale::TYPE_TRACK if $type =~ /^Track$/i;
    return RPS::File::Sale::TYPE_ALBUM if $type =~ /^Bundle$/i;

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

sub formatType {
    my $self = shift;

    my $type = $self->_getByFieldName('formatType') || '';
    return RPS::File::Sale::FORMAT_DOWNLOAD;

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

sub trackName {
    my $self = shift;

    my $name = $self->_getByFieldName('trackName') || '';
    return $name if $self->productType() eq RPS::File::Sale::TYPE_TRACK;
}

sub upc {
    my $self = shift;

    my $upc = $self->_getByFieldName('upc') || 0;
    $upc =~ s/Unknown/0/i;

    return $upc =~ /^\d+$/ ? sprintf "%s", $upc * 1 : undef;
}

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

    my $units = abs( $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 unless $self->price || $self->units;
    return $self->SUPER::_isValidSaleRecord();
}

sub _mapFaceCompatibleVersions {
    return ( 2 );
}

sub _mapFaceServiceID {
    return ('serviceID');
}

sub _mapFaceCountryCode {}
sub _mapFaceProductType {}
sub _mapFaceFormatType {}
sub _mapFaceMediaType {}


1;
