package RPS::Import::Membran::v1;

use strict;
use warnings;

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

use Date::Calc qw(Add_Delta_Days Days_in_Month);

sub physical { 1 }

sub _fieldMapExtended {
    {
        physical => {
            option1 => {
                countryCode     => 'F',
                dateBegin       => 'D5',
                dateEnd         => 'D5',
                productType     => 'E',
                clientProductID => "A",
                artistName      => 'C',
                upc             => 'B',
                albumName       => 'D',
                channel         => 'G',
                priceLevel      => 'G',
                currencyCode    => 'D6',
                wholesalePrice  => 'J',
                returns         => 'L',
                sales           => 'K',
                totalRevenue    => 'Q',
                mediaType       => 'E',
            },
         },
    };
}
sub _unverifiedFieldMapExtended { {} };

sub _headerIdentifierExtended {
    {
        physical => {
            option1 => {
                upc => 'Barcode',
            },
        },
    };
}

my %map = (
    '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,
    },
    'CDDV' => {
        product_type => RPS::File::Sale::TYPE_DVD_CD_SET,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeVideo,
    },
    'MC' => {
        product_type => RPS::File::Sale::TYPE_CASS,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'LPCD' => {
        product_type => RPS::File::Sale::TYPE_LP,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
);

sub channel      { RPS::File::Sale::CHANNEL_RETAIL }
sub serviceID    { Client::Service::DSP_MEMBRAN }
sub currencyCode { shift->_getByFieldName("currencyCode") =~ s/\s.+$//gr }
sub priceLevel   { (shift->_getByFieldName("priceLevel") eq "PR") ? RPS::File::Sale::PLEVEL_PROMO : RPS::File::Sale::PLEVEL_FULL }

my %months      = (
    'JANUARY'   => '01',
    'FEBRUARY'  => '02',
    'MARCH'     => '03',
    'APRIL'     => '04',
    'MAY'       => '05',
    'JUNE'      => '06',
    'JULY'      => '07',
    'AUGUST'    => '08',
    'SEPTEMBER' => '09',
    'OCTOBER'   => '10',
    'NOVEMBER'  => '11',
    'DECEMBER'  => '12',
);

sub saleDates {
    my $self = shift;

    my $dt = $self->_getByFieldName('dateBegin');
    my $startDate;
    my $endDate;

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

sub productType {
    my $self = shift;

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

    $self->fail("Can't determine product_type from: '$type'.");
}

sub mediaType {
    my $self = shift;

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

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

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

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


1;
