package RPS::Import::Napalm::v1;

use strict;
use warnings;

use lib '/app/tools/rps/lib';
use lib '/app/tools/common/lib';
use Date::Calc qw(Days_in_Month);

use parent 'RPS::Import::Importer';

sub physical { 1 }

sub _fieldMap {
    {
        countryCode     => 'J',
        productType     => 'E',
        clientProductID => 'F',
        artistName      => 'C',
        upc             => 'K',
        albumName       => 'D',
        totalRevenue    => 'I',
        mediaType       => 'E',
    }
}
sub _unverifiedFieldMap {
    {
        _netUnits => 'H',
        _altUPC   => 'L',
    }
}

sub _headerIdentifier { artistName => 'Interpret' }

sub currencyCode { 'EUR' }
sub serviceID    { Client::Service::DSP_NAPALM }
sub channel      { RPS::File::Sale::CHANNEL_RETAIL }
sub priceLevel   { RPS::File::Sale::PLEVEL_UNKNOWN }

my %typesMap = (
    '2lp' => {
        product_type => RPS::File::Sale::TYPE_LP,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    '3lp' => {
        product_type => RPS::File::Sale::TYPE_LP,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'bluray' => {
        product_type => RPS::File::Sale::TYPE_DVD,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeVideo,
    },
    'cas5' => {
        product_type => RPS::File::Sale::TYPE_CAS_SIN,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'cd' => {
        product_type => RPS::File::Sale::TYPE_CD,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'dvd' => {
        product_type => RPS::File::Sale::TYPE_DVD,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeVideo,
    },
    'ep' => {
        product_type => RPS::File::Sale::TYPE_CD,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'lp' => {
        product_type => RPS::File::Sale::TYPE_LP,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'mc' => {
        product_type => RPS::File::Sale::TYPE_CASS,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
);

sub saleDates {
    my $self = shift;

    # pyhsisch 2H_2023 bearbeitet_music.xlsx
    if ( my ($s, $y) = $self->filename =~ /(\d)H.(\d{4})/i ) {
        my $monthBegin = $s == 1 ? 1 : 7;
        my $dayBegin = 1;
        my $monthEnd = $s == 1 ? 6 : 12;
        my $dayEnd = $monthEnd == 6 ? 30 : 31;
        return
            sprintf("%04d-%02d-%02d", $y, $monthBegin, $dayBegin ),
            sprintf("%04d-%02d-%02d", $y, $monthEnd, $dayEnd );
    }

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

sub productType {
    my $self = shift;

    my $type = $self->_getByFieldName('productType') || '';
    if ( exists $typesMap{ lc $type } ) {
        return $typesMap{ lc $type }{product_type}
    }

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

sub upc {
    my $self = shift;

    my $upc    = $self->_getByFieldName('upc')     || '';
    my $altUpc = $self->_getByFieldName('_altUPC') || '';
    return $upc || $altUpc;
}

sub mediaType {
    my $self = shift;

    my $type = $self->_getByFieldName('mediaType') || '';
    if ( exists $typesMap{ lc $type } ) {
        return $typesMap{ lc $type }{media_type}
    }

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

sub countryCode {
    my $self = shift;

    my $code = $self->_getByFieldName('countryCode') || '';
    return 'AT' unless $code;

    return 'AT' if $code =~ /^.?sterreich$/i;
    return 'BE' if $code =~ /^belgien$/i;
    return 'DE' if $code =~ /^deutschland$/i;
    return 'CA' if $code =~ /^canada$/i;
    return 'JP' if $code =~ /^japan$/i;
    return 'US' if $code =~ /^u.s.a.$/i;
    return 'CH' if $code =~ /^schweiz$/i;
    return 'HR' if $code =~ /^kroatien$/i;
    return 'PE' if $code =~ /^peru$/i;
    return 'ES' if $code =~ /^spanien$/i;
    return 'NO' if $code =~ /^norwegen$/i;
    return 'IT' if $code =~ /^italien$/i;
    return 'FR' if $code =~ /^frankreich$/i;
    return 'NL' if $code =~ /^niederlande$/i;
    return 'FI' if $code =~ /^finland$/i;
    return 'BG' if $code =~ /^bulgarien$/i;
    return 'GB' if $code =~ /^england$/i;
    return 'IE' if $code =~ /^ireland \(eire\)$/i;
    return 'SE' if $code =~ /^schweden$/i;
    return 'LT' if $code =~ /^litauen$/i;
    return 'GR' if $code =~ /^griechenland$/i;
    return 'AU' if $code =~ /^australien$/i;
    return 'DK' if $code =~ /^d.nemark$/i;
    return 'BR' if $code =~ /^brasilien$/i;
    return 'CZ' if $code =~ /^tschechien$/i;
    return 'EE' if $code =~ /^estland$/i;
    return 'HU' if $code =~ /^ungarn$/i;
    return 'IS' if $code =~ /^iceland \(island\)$/i;
    return 'PL' if $code =~ /^polen$/i;
    return 'CL' if $code =~ /^chile$/i;
    return 'UA' if $code =~ /^ukraine$/i;
    return 'SK' if $code =~ /^slowakei$/i;
    return 'MX' if $code =~ /^mexico$/i;
    return 'IL' if $code =~ /^israel$/i;
    return 'SI' if $code =~ /^slowenien$/i;
    return 'UY' if $code =~ /^uruguay$/i;
    return 'PT' if $code =~ /^portugal$/i;
    return 'RO' if $code =~ /^rum.nien$/i;
    return 'NZ' if $code =~ /^new zealand$/i;
    return 'EC' if $code =~ /^ecuador$/i;
    return 'MT' if $code =~ /^malta$/i;
    return 'LV' if $code =~ /^lettland$/i;
    return 'CO' if $code =~ /^kolumbien$/i;
    return 'TR' if $code =~ /^t.rkei$/i;
    return 'ZA' if $code =~ /^south africa$/i;
    return 'EU' if $code =~ /^eu-raum$/i;
    return 'TW' if $code =~ /^taiwan$/i;
    return 'SG' if $code =~ /^singapore$/i;
    return 'LU' if $code =~ /^luxembourg$/i;
    return 'HK' if $code =~ /^hong kong$/i;
    return 'AR' if $code =~ /^argentinien$/i;
    return 'RU' if $code =~ /^russland$/i;
    return 'GL' if $code =~ /^greenland$/i;
    return 'TH' if $code =~ /^thailand$/i;
    return 'CN' if $code =~ /^china$/i;
    return 'BO' if $code =~ /^bolivia$/i;
    return 'KZ' if $code =~ /^kazakhstan$/i;
    return 'RS' if $code =~ /^serbien\/montenegro$/i;
    return 'KR' if $code =~ /^south korea$/i;
    return 'MA' if $code =~ /^marokko$/i;
    return 'GB' if $code =~ /^(?:gro.britannien|Guernsey Insel)$/i;
    return 'BY' if $code =~ /^belarus$/i;
    return 'PH' if $code =~ /^philippines$/i;
    return 'VE' if $code =~ /^venezuela$/i;
    return 'SV' if $code =~ /^el salvador$/i;
    return 'BA' if $code =~ /^bosnia-herzegovinia$/i;
    return 'CR' if $code =~ /^costa rica$/i;
    return 'MK' if $code =~ /^mazedonien$/i;
    return 'ID' if $code =~ /^indonesien$/i;
    return 'AE' if $code =~ /^united arab emirates$/i;
    return 'CY' if $code =~ /^zypern$/i;
    return 'MY' if $code =~ /^malaysia$/i;
    return 'LI' if $code =~ /^f\. liechtenstein$/i;
    return 'IN' if $code =~ /^indien$/i;

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

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

# physical
sub netUnits {
    my $self = shift;

    my $netUnits = $self->_getByFieldName('_netUnits')    || 0;
    my $revenue  = $self->_getByFieldName('totalRevenue') || 0;

    $netUnits = abs($netUnits)      if $revenue > 0;
    $netUnits = abs($netUnits) * -1 if $revenue < 0;

    return $netUnits;
}

sub sales          { $_[0]->netUnits >= 0 ? $_[0]->netUnits            : 0 }
sub salesRevenue   { $_[0]->totalRevenue > 0 ? $_[0]->totalRevenue     : 0 }
sub returns        { $_[0]->netUnits < 0 ? abs $_[0]->netUnits         : 0 }
sub returnsRevenue { $_[0]->totalRevenue < 0 ? abs $_[0]->totalRevenue : 0 }
sub totalRevenue   { $_[0]->_getByFieldName('totalRevenue') || 0 }

sub _isValidSaleRecord {
    return $_[0]->_getByFieldName('artistName') || $_[0]->_getByFieldName('albumName');
}


1;
