package RPS::Import::MerchNow::v4;

use strict;
use warnings;

use lib '/app/tools/rps/lib';
use parent 'RPS::Import::ImporterMixed';

use Date::Calc qw(Days_in_Month);

sub physical { 2 }

sub _fieldMapExtended {
    {
        mixed => {
            option1 => {
                countryCode      => 'G',
                dateBegin        => 'I',
                formatType       => 'E',
                artistName       => 'B',
                upc              => 'D',
                albumName        => 'C',
                units            => 'J',
                retailPrice      => 'K',
                totalRevenue     => 'O',
                price            => 'O',
                mediaType        => 'E',
            },
         },
    };
}

sub _unverifiedFieldMapExtended {
    {
        mixed => {
            option1 => {
                _productTypePhys => 'A',
                _productTypeDig  => 'E',
                _netUnits        => 'J',
            }
        }
    }
};

sub _headerIdentifierExtended {
    {
        mixed => {
            option1 => {
                upc => 'External ID',
            },
        },
    };
}

my %map = (
    '2 x lp' => {
        product_type => RPS::File::Sale::TYPE_LP,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    '2x lp' => {
        product_type => RPS::File::Sale::TYPE_LP,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    '2xcd' => {
        product_type => RPS::File::Sale::TYPE_CD,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    '7"' => {
        product_type => RPS::File::Sale::TYPE_LP5,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    '7inch vinyl' => {
        product_type => RPS::File::Sale::TYPE_LP5,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'cassette tape' => {
        product_type => RPS::File::Sale::TYPE_CASS,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'cd' => {
        product_type => RPS::File::Sale::TYPE_CD,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'cd/dvd' => {
        product_type => RPS::File::Sale::TYPE_DVD_CD_SET,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeVideo,
    },
    'cdep' => {
        product_type => RPS::File::Sale::TYPE_CD,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'clear w/ blue and green splatter vinyl lp' => {
        product_type => RPS::File::Sale::TYPE_LP,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'deluxe boxset' => {
        product_type => RPS::File::Sale::TYPE_CD,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'deluxe cd/dvd' => {
        product_type => RPS::File::Sale::TYPE_DVD_CD_SET,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeVideo,
    },
    'digipak cd' => {
        product_type => RPS::File::Sale::TYPE_CD,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'double vinyl' => {
        product_type => RPS::File::Sale::TYPE_LP,
        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,
    },
    'ep  cd' => {
        product_type => RPS::File::Sale::TYPE_CD,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'ep cd' => {
        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,
    },
    'picture disc lp' => {
        product_type => RPS::File::Sale::TYPE_LP,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'vinyl 2x lp' => {
        product_type => RPS::File::Sale::TYPE_LP,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'vinyl 2xlp' => {
        product_type => RPS::File::Sale::TYPE_LP,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'vinyl box set *scratch & dent*' => {
        product_type => RPS::File::Sale::TYPE_LP,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'vinyl lp' => {
        product_type => RPS::File::Sale::TYPE_LP,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    '2 x lp' => {
        product_type => RPS::File::Sale::TYPE_LP,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    '2x lp' => {
        product_type => RPS::File::Sale::TYPE_LP,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    '2xcd' => {
        product_type => RPS::File::Sale::TYPE_CD,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    '7 inch' => {
        product_type => RPS::File::Sale::TYPE_LP5,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    '7-inch' => {
        product_type => RPS::File::Sale::TYPE_LP5,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    '7" vinyl lp' => {
        product_type => RPS::File::Sale::TYPE_LP,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'cassette tape' => {
        product_type => RPS::File::Sale::TYPE_CASS,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'cd' => {
        product_type => RPS::File::Sale::TYPE_CD,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'cd/dvd' => {
        product_type => RPS::File::Sale::TYPE_DVD_CD_SET,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeVideo,
    },
    'cdep' => {
        product_type => RPS::File::Sale::TYPE_CD,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'deluxe boxset' => {
        product_type => RPS::File::Sale::TYPE_CD,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'deluxe cd/dvd' => {
        product_type => RPS::File::Sale::TYPE_DVD_CD_SET,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeVideo,
    },
    'lp' => {
        product_type => RPS::File::Sale::TYPE_LP,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'picture disc lp' => {
        product_type => RPS::File::Sale::TYPE_LP,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'vinyl 3xlp' => {
        product_type => RPS::File::Sale::TYPE_LP,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'vinyl lp' => {
        product_type => RPS::File::Sale::TYPE_LP,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'white lp' => {
        product_type => RPS::File::Sale::TYPE_LP,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'evr reissue' => {  # must be checked with an additional rule
        product_type => RPS::File::Sale::TYPE_CD,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    '2x l' => {
        product_type => RPS::File::Sale::TYPE_LP,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'double lp' => {
        product_type => RPS::File::Sale::TYPE_LP,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'vinyl' => {
        product_type => RPS::File::Sale::TYPE_LP,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'black lp' => {
        product_type => RPS::File::Sale::TYPE_LP,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'single digital download' => {
        product_type => RPS::File::Sale::TYPE_ALBUM,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'digital download' => {
        product_type => RPS::File::Sale::TYPE_ALBUM,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'digital download special track' => {
        product_type => RPS::File::Sale::TYPE_ALBUM,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'picture disc' => {
        product_type => RPS::File::Sale::TYPE_LP,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
);

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

sub countryCode {
    my $self = shift;

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

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

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

sub saleDates {
    my $self = shift;

    my $date = $self->_getByFieldName('dateBegin') || '';

    # MM-DD-YYYY
    if ( my ($year, $month) = $date =~ /^(\d{4})-(\d{2})-\d{2}$/ ) {
        my $startDate = sprintf( "%04d-%02d-%02d", $year, $month, 1 );
        my $endDate = sprintf( "%04d-%02d-%02d", $year, $month, Days_in_Month( $year, $month ) );
        return ( $startDate, $endDate );
    }

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

sub productType {
    my $self = shift;

    my $typePhys = lc( $self->_getByFieldName('_productTypePhys') || '' );
    my $typeDig  = lc( $self->_getByFieldName('_productTypeDig')  || '' );
    $typePhys =~ s/^\s+|\s+$//g;
    $typeDig =~ s/^\s+|\s+$//g;

    # digital
    if ( $typeDig =~ /^Digital Download$/i ) {
        return RPS::File::Sale::TYPE_ALBUM;
    }

    # physical
    if ( $typeDig =~ /EVR Reissue/i && $typePhys =~ /-CD/i ) {
        return RPS::File::Sale::TYPE_CD;
    } elsif ( $typeDig !~ /^evr reissue$/ ) {
        return $map{$typeDig}{product_type};
    }

    $self->fail("Unable to determine product type from: '$typeDig' and/or '$typePhys'");
}

sub formatType {
    my $self = shift;

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

    if ( $type =~ /^Digital Download$/i ) {
        return RPS::File::Sale::FORMAT_DOWNLOAD;
    }

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

sub mediaType {
    my $self = shift;

    my $typePhys = lc( $self->_getByFieldName('_productTypePhys') || '' );
    my $typeDig  = lc( $self->_getByFieldName('_productTypeDig')  || '' );
    $typePhys =~ s/^\s+|\s+$//g;
    $typeDig =~ s/^\s+|\s+$//g;

    # digital
    if ( $typeDig =~ /^Digital Download$/i ) {
        return RPS::DB::Item::MediaType::kMediaTypeAudio;
    }

    # physical
    if ( $typeDig =~ /EVR Reissue/i && $typePhys =~ /-CD/i ) {
        return $map{$typeDig}{media_type};
    } elsif ( $typeDig !~ /^evr reissue$/ ) {
        return $map{$typeDig}{media_type};
    }

    $self->fail("Unable to determine media type from: '$typeDig' and/or '$typePhys'");
}

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

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

    if ( $price > 0 ) {
        $units = $units ? abs($units) : 1;
    } elsif ( $price < 0 ) {
       $units = $units ? -1 * abs($units) : -1;
    }

    return $units;
}

# physical
sub netUnits       { $_[0]->_getByFieldName('_netUnits')    || 0 }
sub totalRevenue   { $_[0]->_getByFieldName('totalRevenue') || 0 }
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 _isValidSaleRecord {

    return if $_[0]->_getByFieldName('albumName') =~ /^Subtotal/i;

    return $_[0]->_getByFieldName('totalRevenue') || $_[0]->_getByFieldName('_netUnits');
}

1;
