package RPS::Import::DownRightMerch::v1;

use strict;
use warnings;

use lib '/app/tools/rps/lib';
use RPS::Import::ServiceMap;

use parent 'RPS::Import::ImporterMixed';

sub physical { 2 }

sub _fieldMapExtended {
    {
        mixed => {
            option1 => {
                countryCode      => 'P',
                dateBegin        => 'D',
                formatType       => 'A',
                artistName       => 'A',
                albumName        => 'A',
                units            => 'G',
                retailPrice      => 'F',
                totalRevenue     => 'O',
                price            => 'O',
            },
        },
    };
}

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

sub _headerIdentifierExtended {
    {
        mixed => {
            option1 => {
                countryCode => 'Territory',
            },
        },
    };
}

sub currencyCode { 'USD' }

sub serviceID   { Client::Service::DSP_DOWN_RIGHT_MERCH }

sub countryCode {
    my $self = shift;

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

    my $oCountry = Common::Country->Get($name);
    return $oCountry->alpha2() if $oCountry;

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

sub saleDates {
    my $self = shift;

    # MM/DD/YY or YYYY-MM-DD
    my $dateBegin = $self->_getByFieldName('dateBegin') || '';

    my ($year, $month, $day);
    if ( $dateBegin =~ /(\d{4})-(\d{1,2})-(\d{1,2})/ ) {
        ($year, $month, $day) = ($1, $2, $3);
    } elsif ( $dateBegin =~ /^(\d{1,2})[\/\.-](\d{1,2})[\/\.-](\d{2,4})$/ ) {
        ($year, $month, $day) = ($3, $1, $2);
    } elsif ( $dateBegin =~ m/^\d{5}\.??/ ) {
        my $date = Spreadsheet::ParseExcel::Utility::ExcelFmt( "yyyy-mm-dd", $dateBegin );
        ($year, $month, $day) = $date =~ /(\d{4})\-(\d{2})\-(\d{2})/;
    } else {
        $self->fail( "Unable to determine date from: '$dateBegin'." );
    }

    $dateBegin = sprintf "%04d-%02d-%02d", length $year == 2 ? "20$year" : $year , $month, $day;
    return $self->_getDates( date_begin => $dateBegin );
}

sub productType {
    my $self = shift;

    my $typePhys = $self->_getByFieldName('_productTypePhys') || '';
    my $typeDig  = $self->_getByFieldName('_productTypeDig')  || '';

    # physical
    if ( $typePhys =~ /.*\-([A-Z]+)$/i ) {
        return RPS::File::Sale::TYPE_CD if $1 =~ /^CD$/i;
        return RPS::File::Sale::TYPE_LP if $1 =~ /^LP$/i;
    }

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

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

sub formatType {
    my $self = shift;

    my $type = $self->_getByFieldName('formatType') || '';
    return RPS::File::Sale::FORMAT_DOWNLOAD if $type =~ /(?:EP Digital Download|Digital (?:Album|Download|))/i;

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

sub artistName {
    my $self = shift;

    my $name = $self->_getByFieldName('artistName') || '';
    if ( $name =~ /-/ ) {
        ($name) = split /\s*\-\s*/, $name;
    } elsif ( $name =~ /^(.*?)\s*"/ ) {
        $name = $1;
    }

    return $name;
}

sub albumName {
    my $self = shift;

    my $name = $self->_getByFieldName('artistName') || '';
    if ( $name =~ /.*\-\s*(.+)?\s*$/ ) {
        $name = $1;
    } elsif ( $name =~ /.*\"(.+)?\".*/ ) {
        $name = $1;
    }

    return $name;
}

sub mediaType  {
    return RPS::DB::Item::MediaType::kMediaTypeAudio;
}

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

    my $units = $self->_getByFieldName('units') || 0;
    my $price = $self->_getByFieldName('price') || 0;
    return $price < 0 ? abs($units) * -1 : $units;
}

# physical
sub channel        { RPS::File::Sale::CHANNEL_RETAIL }
sub priceLevel     { RPS::File::Sale::PLEVEL_UNKNOWN }
sub netUnits       { int(shift->_getByFieldName('_netUnits') || 0) }
sub totalRevenue   { shift->_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 _processSheet {
    my ($self, $sheet, $sheetnum) = @_;

    if ( $self->{sheetname} =~ /^(?:Media|Line)$/i ) {
        return $self->SUPER::_processSheet( $sheet, $sheetnum );
    }

}

sub _isValidSaleRecord {
    my $self = shift;

    return 1 if $self->units || $self->price;

    return 0;
}

1;
