package RPS::Import::Alliance::v6;

use strict;
use warnings;

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

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

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


sub _headerIdentifier { upc => 'UPC' }

sub _fieldMap {
    {
        labelName       => 'B',
        countryCode     => 'Z',
        dateBegin       => 'D',
        dateEnd         => 'D',
        productType     => 'J',
        clientProductID => 'J',
        artistName      => 'L',
        upc             => 'K',
        albumName       => 'M',
        wholesalePrice  => 'O',
        totalRevenue    => 'T',
        mediaType       => 'J',
        salesRevenue    => 'R',
        returnsRevenue  => 'R',
    };
}

sub _unverifiedFieldMap {
    {
        _netUnits => 'N',
        _distFee  => 'U',
    }
}

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

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

    print "Skipping sheet: $self->{sheetname}\n" and return if $self->{sheetname} =~ /^Vinyl Tab$/i;

    return $self->SUPER::_processSheet( $sheet, $sheetnum );
}

sub countryCode {
    my $self = shift;

    my $country = $self->_getByFieldName('countryCode') || '';
    return 'SA' if $country =~ /^NT$/i;

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

    $self->fail("Can't determine country_code from '$country'.");
}

sub productType {
    my $self   = shift;

    my $type = $self->_getByFieldName('productType') || '';
    if ( $type =~ /(\.2|SACD)$/i ) {
        return RPS::File::Sale::TYPE_CD;
    } elsif ( $type =~ /\.(1|7)$/i ) {
        return RPS::File::Sale::TYPE_LP;
    } elsif ( $type =~ /\.4$/i ) {
        return RPS::File::Sale::TYPE_CASS;
    } elsif ( $type =~ /DVA|DVD$/i ) {
        return RPS::File::Sale::TYPE_DVD;
    }

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

sub mediaType {
    my $self = shift;

    my $type = $self->_getByFieldName('mediaType') || '';
    if ( $type =~ /(?:\.1|\.2|\.7|\.4|SACD)/i ) {
        return RPS::DB::Item::MediaType::kMediaTypeAudio;
    } elsif ( $type =~ /(?:DVA|DVD)/i ) {
        return RPS::DB::Item::MediaType::kMediaTypeVideo;
    }

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

sub clientProductID {
    my $self = shift;

    my $name = $self->_getByFieldName('clientProductID') || '';
    return $name =~ /(\w+)\.\w+$/ ? $1 : $name;
}

sub netUnits     { $_[0]->_getByFieldName('_netUnits')    || 0 }
sub totalRevenue { $_[0]->_getByFieldName('totalRevenue') || 0 }

sub sales {
    my $self = shift;
    return $self->netUnits > 0 ? $self->netUnits : 0;
}

sub salesRevenue {
    my $self = shift;

    my $salesRevenue = $self->_getByFieldName('salesRevenue') || 0;
    my $distFee      = $self->_getByFieldName('_distFee')     || 0;

    $salesRevenue = sprintf "%.8f", $salesRevenue - $distFee;
    return $salesRevenue > 0 ? $salesRevenue : 0;
}

sub returns {
    my $self = shift;
    return $self->netUnits < 0 ? abs( $self->netUnits ) : 0;
}

sub returnsRevenue {
    my $self = shift;

    my $returnsRevenue = $self->_getByFieldName('returnsRevenue') || 0;
    my $distFee        = $self->_getByFieldName('_distFee')       || 0;

    $returnsRevenue = sprintf "%.8f", $returnsRevenue - $distFee;
    return $returnsRevenue < 0 ? abs($returnsRevenue) : 0;
}

sub _isValidSaleRecord {
    my $self = shift;

    return ( ($self->sales || $self->returns ) && $self->albumName );
}


1;
