package RPS::Import::FatBeats::v2;

use strict;
use warnings;

use lib '/app/tools/common/lib';
use Common::Country;

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

sub physical { 2 }

sub _fieldMapExtended {
    {
        physical => {
            option1 => {
                countryCode     => 'I',
                productType     => 'D',
                clientProductID => 'C',
                artistName      => 'D',
                upc             => 'E',
                albumName       => 'D',
                retailPrice     => 'L',
                totalRevenue    => 'N',
            },
        },
    };
}

sub _unverifiedFieldMapExtended {
    {
        physical => {
            option1 => {
                _netUnits        => 'M',
                _itemDescription => 'D',
            },
        }
    };
}

sub _headerIdentifierExtended {
    {
        physical => {
            option1 => {
                productType => 'Item Description',
            },
        },
    };
}

sub currencyCode { 'USD' }
sub channel      { RPS::File::Sale::CHANNEL_RETAIL }
sub priceLevel   { RPS::File::Sale::PLEVEL_UNKNOWN }

sub saleDates {
    my $self = shift;

    # 06/01/18 - 07/31/18 on the Summary sheet
    return @{ $self->{_datesPeriod} } if exists $self->{_datesPeriod};

    if ( exists $self->{_period} && $self->{_period} =~ /^(\d{1,2})\/(\d{1,2})\/(?:20)?(\d{2})\s+\-\s+(\d{1,2})\/(\d{1,2})\/(?:20)?(\d{2})$/i ) {
        $self->{_datesPeriod} = [
            $self->_getDates(
                date_begin => sprintf( "%04d-%02d-%02d", "20$3", $1, $2 ),
                date_end   => sprintf( "%04d-%02d-%02d", "20$6", $4, $5 )
            )
        ];
    }

    return @{ $self->{_datesPeriod} } if exists $self->{_datesPeriod};
}

sub countryCode {
    my $self = shift;

    my $name = $self->_getByFieldName('countryCode') || 'US';
    my $oCountry = Common::Country->Get($name);
    return $oCountry ? $oCountry->alpha2 : undef;
}

sub _getFromItemDescription {
    my ($self, $type) = @_;

    my $cachedKey = "___" . $self->linenum . "_description";
    if ( exists $self->{$cachedKey} && exists $self->{$cachedKey}{$type} ) {
        return $self->{$cachedKey}{$type};
    }

    # example: "GrandeMarshall - Risk/Reward (CD)" OR "Fool's Gold Presents: Night Shift (CD)"
    my $value = $self->_getByFieldName('_itemDescription') || '';

    my @parts = split /\s+-\s+/, $value;
    unshift @parts, '' if @parts == 1;
    @parts[1,2] = $parts[1] =~ /^(.+)\s?\((.+)\)$/;
    foreach (@parts) {
        $_ =~ s/^\s+|\s+$//g;
        @{ $self->{$cachedKey} }{ qw/artistName albumName productType/ } = @parts;
    }

    return $self->{$cachedKey}{$type};
}

sub productType {
    my $self = shift;

    my $type = $self->_getFromItemDescription('productType');
    if ( $type =~ /^(?:picture disc )?(?:CD|EP)(?: boxset)?$/i ) {
        return RPS::File::Sale::TYPE_CD;
    } elsif ( $type =~ /^2XCD$/i ) {
        return RPS::File::Sale::TYPE_DBL_CD;
    } elsif ( $type =~ /^(?:LP|Splatter Vinyl EP|6x7(?:"|'') Box Set|2XLP w\/ Poster)$/i ) {
        return RPS::File::Sale::TYPE_LP;
    } elsif ( $type =~ /^Red Vinyl 2XLP$/i ) {
        return RPS::File::Sale::TYPE_LP;
    } elsif ( $type =~ /^(?:10["']{1,2} Vinyl EP|(?:12|7)(?:"|'')|2XLP(?: White Vinyl)?)$/i ) {
        return RPS::File::Sale::TYPE_LP5;
    }

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

sub artistName { $_[0]->_getFromItemDescription('artistName') }
sub albumName  { $_[0]->_getFromItemDescription('albumName') }

# physical
sub netUnits {
    my $self = shift;

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

    if ( $revenue > 0 ) {
        return abs $units;
    } elsif ( $revenue < 0 ) {
       return abs($units) * -1
    }

    return $units;
}
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 $_[0]->totalRevenue && $_[0]->_getByFieldName('_itemDescription');
}

sub _processSheet {
    my ($self, $sheet, $sheetnum) = @_;

    my $sheetname = $self->{sheetname};
    # get a sales period from the 'C15' or 'C14' cell on the summary sheet
    $self->{_period} = $sheet->[14][2] if $sheetname =~ /^summary$/i;
    $self->{_period} = $sheet->[13][2] if $sheetname =~ /^summary$/i && !$self->{_period};

    return $self->SUPER::_processSheet($sheet, $sheetnum) if $sheetname =~ /^sales$/i;
}


1;
