package RPS::Import::Vydia::v1;

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 {
    {
        serviceID       => 'M',
        countryCode     => 'Q',
        dateBegin       => 'U',
        productType     => 'I',
        artistName      => 'G',
        upc             => 'J',
        albumName       => 'F',
        isrc            => 'I',
        trackName       => 'F',
        units           => 'V',
        currencyCode    => 'AA1',
        price           => 'AA',
    }
}

sub _unverifiedFieldMap {
    {
        _network   => 'M',
        _eventType => 'S',
        _mediaType => 'N',
        _assetType => 'O',
        _group     => 'L',
    }
}

sub _headerIdentifier { isrc => 'ISRC' }

sub saleDates {
    my $self = shift;

    my $dt = $self->_getByFieldName('dateBegin') || '';
    my ( $startDate, $endDate ) = $self->_getDates( date_begin => $dt );

    return $startDate, $endDate;
}

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->handleError( "Unknown country_code: '$name'", RPS::DB::Item::SaleImportError::kErrorCountry );
    return $name;
}

sub productType {
    my $self = shift;

    my $type = $self->_getByFieldName('productType') || '';
    return $type ? RPS::File::Sale::TYPE_TRACK : RPS::File::Sale::TYPE_ALBUM;
}

sub formatType {
    my $self = shift;

    my $_network   = $self->_getByFieldName('_network')   || '';
    my $_eventType = $self->_getByFieldName('_eventType') || '';

    return RPS::File::Sale::FORMAT_EPHEMERAL   if $_network =~ /^SoundExchange$/i;
    return RPS::File::Sale::FORMAT_PERFORMANCE if $_network =~ /Neighboring Rights/i;
    return RPS::File::Sale::FORMAT_STREAM      if $_eventType =~ /^streams$/i;
    return RPS::File::Sale::FORMAT_DOWNLOAD    if $_eventType =~ /^downloads$/i;


    $self->handleError( "Unknown format_type: '$_network', '$_eventType'", RPS::DB::Item::SaleImportError::kErrorFormatType );
}

sub albumName {
    my $self = shift;

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

sub trackName {
    my $self = shift;

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

sub currencyCode {
    my $self = shift;

    my $code = $self->_getByFieldName('currencyCode') || '';
    return 'USD' if $code =~ /^USD/i;
}

sub mediaType {
    my $self = shift;

    my $_mediaType = $self->_getByFieldName('_mediaType') || '';
    my $_assetType = $self->_getByFieldName('_assetType') || '';
    my $_group     = $self->_getByFieldName('_group')     || '';

    if ( $_mediaType =~ /^audio$/i && ( !$_assetType || $_assetType =~ /^sound_recording$/i) ) {
        return RPS::DB::Item::MediaType::kMediaTypeAudio;
    } elsif ( $_mediaType =~ /^comp$/i && $_assetType =~ /^sound_recording$/i ) {
        return RPS::DB::Item::MediaType::kMediaTypeAudio;
    } elsif ( $_mediaType =~ /^video$/i && $_assetType =~ /^(?:sound_recording|music_video)$/i ) {
        return RPS::DB::Item::MediaType::kMediaTypeVideo;
    } elsif ( $_mediaType =~ /^(?:audio|video)$/i && $_assetType =~ /^composition$/i ) {
        $self->fail("Can't determine media_type for: '$_mediaType', '$_assetType', '$_group'");
    }

    $self->handleError( "Unknown media_type: '$_mediaType', '$_assetType'", RPS::DB::Item::SaleImportError::kErrorFormatType );
}

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;

    my $dateBegin = $self->_getByFieldName('dateBegin') || '';
    return 0 if $dateBegin =~ /^\/\//;

    my $_mediaType = $self->_getByFieldName('_mediaType') || '';
    my $_assetType = $self->_getByFieldName('_assetType') || '';
    my $_group     = $self->_getByFieldName('_group')     || '';

    if ( $_assetType =~ /^composition$/i ) {
        if ( $_mediaType =~ /^(?:audio)$/i ) {
            # exact
            return 0 if $_group =~ /^ASCAP$/i;
            return 0 if $_group =~ /^(?:MRI Publishing \(Mechanical Yousician\))$/i;
            return 0 if $_group =~ /^Publishing \(International - SM\)$/;
            # contains
            return 0 if $_group =~ /You\s*Tube Publishing/i;
            return 0 if $_group =~ /(?:MLC|BMI|MRI)/i;
        }
        if ( $_mediaType =~ /^(?:video)$/i ) {
            # contains
            return 0 if $_group =~ /MLC/i;
            return 0 if $_group =~ /You\s*Tube Publishing/i;
        }
    }

    return 0 if !$self->price && !$self->units;

    return 1;
}

sub _mapFaceServiceID   { 'serviceID' }
sub _mapFaceCountryCode { 'countryCode' }
sub _mapFaceProductType {}
sub _mapFaceFormatType  { '_network', '_eventType' }
sub _mapFaceMediaType   { '_mediaType', '_assetType', '_group' }


1;