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

sub _unverifiedFieldMapExtended { {} }

sub _headerIdentifierExtended {
    {
        digital => {
            option1 => { productType => 'Mengeneinheit' }
        }
    }
}

my %mapCountries = (
    'A' => 'AT', 'ABW' => 'AW', 'AFI' => 'AF', 'AL' => 'AL',
    'ALA' => 'AX', 'AND' => 'AD', 'ANT' => 'AG', 'ARM' => 'AM',
    'ASM' => 'AS', 'ATG' => 'AG', 'AUS' => 'AU', 'AZE' => 'AZ',
    'B' => 'BE', 'BD' => 'BD', 'BDS' => 'BB', 'BG' => 'BG',
    'BH' => 'BH', 'BIH' => 'BA', 'BLR' => 'BY', 'BMU' => 'BM',
    'BOL' => 'BO', 'BR' => 'BR', 'BRN' => 'BN', 'BRU' => 'BN',
    'BS' => 'BS', 'BTN' => 'BT', 'BUR' => 'BF', 'CAY' => 'KY',
    'CDN' => 'CA', 'CH' => 'CH', 'CI' => 'CI', 'CL' => 'CL',
    'CNY' => 'CN', 'CO' => 'CO', 'CPV' => 'CV', 'CR' => 'CR',
    'CY' => 'CY', 'CZ' => 'CZ', 'D' => 'DE', 'DK' => 'DK',
    'DOM' => 'DO', 'DZ' => 'DZ', 'E' => 'ES', 'EAK' => 'KE',
    'EAT' => 'ET', 'EAU' => 'UG', 'EC' => 'EC', 'ES' => 'ES',
    'EST' => 'EE', 'ET' => 'ET', 'ETH' => 'ET', 'F' => 'FR',
    'FJI' => 'FJ', 'FL' => 'LI', 'FLK' => 'FK', 'FR' => 'FR',
    'GAB' => 'GA', 'GB' => 'GB', 'GBM' => 'GB', 'GBZ' => 'GB',
    'GCA' => 'GA', 'GEO' => 'GE', 'GGY' => 'GG', 'GH' => 'GH',
    'GIN' => 'GN', 'GLP' => 'GP', 'GNQ' => 'GQ', 'GR' => 'GR',
    'GRO' => 'GR', 'GU' => 'GU', 'GUF' => 'GF', 'GUY' => 'GY',
    'H' => 'HU', 'HK' => 'HK', 'HND' => 'HN', 'HRV' => 'HR',
    'I' => 'IT', 'IL' => 'IL', 'IND' => 'IN', 'IO' => 'IO',
    'IR' => 'IR', 'IRL' => 'IE', 'IRQ' => 'IQ', 'IS' => 'IS',
    'J' => 'JP', 'JA' => 'JP', 'JE' => 'JE', 'JOR' => 'JO',
    'K' => 'KH', 'KAZ' => 'KZ', 'KGZ' => 'KG', 'KT' => 'CX',
    'L' => 'LU', 'LAO' => 'LA', 'LAR' => 'LA', 'LS' => 'LS',
    'LTU' => 'LT', 'LVA' => 'LV', 'M' => 'MM', 'MA' => 'MA',
    'MAC' => 'MO', 'MAL' => 'MA', 'MC' => 'MC', 'MDA' => 'MD',
    'MDV' => 'MV', 'MEX' => 'MX', 'MK' => 'MK', 'MNG' => 'MN',
    'MOC' => 'MO', 'MON' => 'MO', 'MS' => 'MS', 'MTQ' => 'MQ',
    'MW' => 'MW', 'MYT' => 'YT', 'N' => 'NO', 'NA' => 'NA',
    'NAM' => 'NA', 'NCL' => 'NC', 'NFK' => 'NF', 'NHB' => 'VU',
    'NIC' => 'NI', 'NIU' => 'NU', 'NL' => 'NL', 'NMA' => 'NA',
    'NPL' => 'NP', 'NRU' => 'NR', 'NZ' => 'NZ', 'OMN' => 'OM',
    'P' => 'PT', 'PA' => 'PA', 'PAK' => 'PK', 'PAN' => 'PA',
    'PE' => 'PE', 'PL' => 'PL', 'PNG' => 'PG', 'PRI' => 'PR',
    'PS' => 'PS', 'PY' => 'PY', 'PYF' => 'PF', 'QAT' => 'QA',
    'R' => 'RO', 'RA' => 'RU', 'RB' => 'BO', 'RC' => 'CN',
    'RCB' => 'CG', 'RCH' => 'CL', 'REU' => 'RE', 'RH' => 'HT',
    'RI' => 'ID', 'RIM' => 'MU', 'RL' => 'LB', 'RM' => 'MG',
    'ROK' => 'RO', 'RP' => 'PH', 'RPB' => 'BM', 'RSM' => 'RS',
    'RSR' => 'RS', 'RU' => 'RU', 'RUS' => 'RU', 'S' => 'SE',
    'SA' => 'SA', 'SD' => 'SD', 'SF' => 'FI', 'SGP' => 'SG',
    'SJM' => 'SJ', 'SK' => 'SK', 'SME' => 'SM', 'SN' => 'SN',
    'SOL' => 'SO', 'SP' => 'ES', 'SPM' => 'PM', 'SRB' => 'RS',
    'STL' => 'ST', 'SVN' => 'SI', 'SY' => 'SY', 'TC' => 'TC',
    'THA' => 'TH', 'TJK' => 'TJ', 'TK' => 'TK', 'TN' => 'TN',
    'TON' => 'TO', 'TR' => 'TR', 'TT' => 'TT', 'TUR' => 'TR',
    'TUV' => 'TV', 'U' => 'UA', 'UAE' => 'AE', 'UKR' => 'UA',
    'USA' => 'US', 'UZB' => 'UZ', 'VGB' => 'VG', 'VIR' => 'VI',
    'VN' => 'VN', 'WAL' => 'GB', 'WAN' => 'NG', 'WG' => 'GD',
    'WLF' => 'WF', 'WS' => 'WS', 'WV' => 'VC', 'YEM' => 'YE',
    'YV' => 'VE', 'Z' => 'ZM', 'ZA' => 'ZA',
);

sub currencyCode { 'EUR' }

sub saleDates {
    my $self = shift;

    if ( my($y, $m) = $self->filename =~ /SPV.(\d{4}).(\d{2})/i ) {
        return $self->_getDates(
            date_begin => sprintf( "%04d-%02d-%02d", $y, $m, 1),
            date_end   => sprintf( "%04d-%02d-%02d", $y, $m, Days_in_Month($y, $m))
        )
    }

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

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;

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

sub countryCode {
    my $self = shift;

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

    if ( exists $mapCountries{uc $name} ) {
        return $mapCountries{uc $name};
    }

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

sub productType {
    my $self = shift;

    my $type = $self->_getByFieldName('productType') || '';
    return RPS::File::Sale::TYPE_ALBUM if $type =~ /^DL\-LP$/i;
    return RPS::File::Sale::TYPE_TRACK if $type =~ /^(?:DL\-(?:TR|SI|VID)|\/{4})$/i;

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

sub formatType {
    my $self = shift;

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

    return RPS::File::Sale::FORMAT_DOWNLOAD    if $type =~ /^DL\-(?:LP|TR|SI|VID)$/i;
    return RPS::File::Sale::FORMAT_PERFORMANCE if $type =~ /^\/{4}$/i;

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

sub mediaType {
    my $self = shift;

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

    return RPS::DB::Item::MediaType::kMediaTypeAudio if $type =~ /^(?:DL\-(?:LP|TR|SI)|\/{4})$/i;
    return RPS::DB::Item::MediaType::kMediaTypeVideo if $type =~ /^DL\-VID$/i;

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

sub clientProductID {
    my $self = shift;

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

    if ( $productType =~ /^(?:DL\-LP|\/{4})$/i ) {
        return $clientProductID;
    }

    return;
}

sub albumName {
    my $self = shift;

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

    if ( $productType =~ /^DL\-LP$/i ) {
        return $albumName;
    }

    return;
}

sub trackName {
    my $self = shift;

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

    if ( $productType =~ /^(?:DL\-(?:TR|SI|VID)|\/{4})$/i ) {
        return $trackName;
    }

    return;
}

sub price {
    my $self = shift;

    my $price = $self->_getByFieldName('price') || 0;
    $price =~ s/\.//g;
    $price =~ s/,/\./g;

    return $price;
}

sub unitPrice { abs shift->SUPER::unitPrice }

sub units {
    my $self = shift;

    my $units = $self->_getByFieldName('units') || 0;
    my $price = $self->price;

    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 $units = $self->units;
    my $price = $self->price;

    return $units || $price ? 1 : 0;
}

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


1;
