package RPS::Import::CreateMusicGroup::v1;

use strict;
use warnings;

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

use parent 'RPS::Import::ImporterMixed';

sub physical { 0 }

sub _fieldMapExtended {
    {
        digital => {
            option1 => {
                labelName    => 'D',
                serviceID    => 'F',
                countryCode  => 'E',
                dateBegin    => 'V',
                dateEnd      => 'V',
                formatType   => 'Q',
                artistName   => 'H',
                upc          => 'C',
                albumName    => 'I',
                isrc         => 'B',
                trackName    => 'I',
                units        => 'L',
                currencyCode => 'P',
                price        => 'P',
                mediaType    => 'Q',
            },
        },
    };
}

sub _unverifiedFieldMapExtended {
    {
        digital => {
            option1 => {
                _col_A => 'A',
            },
        },
    };
}

sub _headerIdentifierExtended {
    {
        digital => {
            option1 => {
                mediaType => 'Media',
            },
        },
    };
}

sub _preProcess {
    my ($self, %args) = @_;

    $self->SUPER::_preProcess(%args);

    foreach my $line ( @{ $args{lines} } ) {
        $self->{line} = $line;
        my $currencyCode = $self->_getByFieldName('currencyCode') || '';
        if ( $self->_isHeader && $currencyCode =~ /\(.\s(\w{3})\)/i ) {
            return $self->{_currencyCode} = $1;
        }
    }

    $self->fail("Unable to get currency code from header");
}

sub serviceID {
    my $self = shift;

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

    $self->fail("Unknown service: $service");
}

sub currencyCode {
    my $self = shift;

    return $self->{_currencyCode};
}

sub upc {
    my $self = shift;

    my $upc  = $self->_getByFieldName('upc') || 0;
    return $upc * 1;
}

sub countryCode {
    my $self = shift;

    my $name = lc( $self->_getByFieldName('countryCode') || 'US' );
    return 'DZ' if $name =~ /^Algeria$/i;
    return 'BO' if $name =~ /^Bolivia/i;
    return 'BA' if $name =~ /^Bosnia and Herzegowina/i;
    return 'KR' if $name =~ /^Korea/i;
    return 'MK' if $name =~ /^Macedonia/i;
    return 'TW' if $name =~ /^Taiwan/i;
    return 'TZ' if $name =~ /^Tanzania/i;
    return 'VI' if $name =~ /^Virgin islands,u\.s\./i;
    return 'VG' if $name =~ /^Virgin islands,british/i;
    return 'VE' if $name =~ /^Venezuela/i;
    return 'MD' if $name =~ /^Moldova/i;
    return 'LA' if $name =~ /^Lao peoples democratic republic/i;
    return 'CI' if $name =~ /^Cote divoire/i;
    return 'CG' if $name =~ /^Congo/i;

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

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

sub productType {
    my $self = shift;

    my $isrc = $self->_getByFieldName('isrc') || '';
    my $upc  = $self->_getByFieldName('upc')  || '';
    return $upc && !$isrc ? RPS::File::Sale::TYPE_ALBUM : RPS::File::Sale::TYPE_TRACK;
}

sub formatType {
    my $self = shift;

    my $type = $self->_getByFieldName('formatType') || '';
    return RPS::File::Sale::FORMAT_STREAM      if $type =~ /^(?:Ad-Revenue|Streaming)$/i;
    return RPS::File::Sale::FORMAT_DOWNLOAD    if $type =~ /^(?:Download)$/i;
    return RPS::File::Sale::FORMAT_PERFORMANCE if $type =~ /^(?:Radio)$/i;

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

sub mediaType {
    my $self = shift;

    my $type = $self->_getByFieldName('mediaType') || '';
    if ( $type =~ /^(?:Ad-Revenue|Streaming|Download|Radio)$/i ) {
        return RPS::DB::Item::MediaType::kMediaTypeAudio;
    }

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

sub albumName {
    my $self = shift;

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

sub trackName {
    my $self = shift;

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

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;

    # the rule from the template
    my $type = $self->_getByFieldName('mediaType') || '';
    return if $type =~ /^Publishing$/i;

    # an additional headers
    my $colA = $self->_getByFieldName('_col_A')      || '';
    return if $colA =~ /^(?:Account:.*|Company)$/i;

    # an empty line
    my $label   = $self->_getByFieldName('labelName')   || '';
    my $country = $self->_getByFieldName('countryCode') || '';
    return if !$label && !$country && !$self->price && !$self->units;

    return 1;
}


1;