package RPS::Import::MVDPhysical;

use strict;

use lib '/app/tools/rps/lib';
use base 'RPS::Import::Importer';

sub _headerIdentifier { ( dateBegin => qr/DATE|period_start/ ) }

sub _fieldMap {
    my $self      = shift;
    my %field_map = (
        2 => {
            dateBegin    => 'M',
            totalRevenue => 'L',
        },
        3 => {
            dateBegin        => 'F',
            dateEnd          => 'G',
            upc              => 'K',
            totalRevenue     => 'Q',
            clientProductID  => 'J',
            retailPrice      => 'N',
            wholesalePrice   => 'R',
        },
        4 => {
            productType  => 'C',
            dateBegin    => 'N',
            totalRevenue => 'M',
        },

    );
    return $field_map{ $self->_version };
}

sub _unverifiedFieldMap {
    my $self      = shift;
    my %field_map = (
        2 => {
            title    => 'B',
            netUnits => 'G',
        },
        3 => {
            title    => 'L',
            netUnits => 'M',
        },
        4 => {
            title    => 'B',
            netUnits => 'H',
        },
    );
    return $field_map{ $self->_version };
}

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

sub productType {
    my $self = shift;
    if ( exists $self->_fieldMap->{'productType'} ) {
        my $type = $self->_getByFieldName('productType');
        if ( $type =~ /^CD$/i ) {
            return RPS::File::Sale::TYPE_CD;
        } elsif ( $type =~ /^ZCD$/i ) {
            return RPS::File::Sale::TYPE_CD;
        } elsif ( $type =~ /^D$/i ) {
            return RPS::File::Sale::TYPE_DVD;
        } else {
            $self->fail("Unable to determine product type from '$type'");
        }
    } else {
        return RPS::File::Sale::TYPE_CD;
    }
}

sub saleDates {
    my $self = shift;
    my $ds   = $self->_getByFieldName('dateBegin');
    my $sdate;
    my $edate;
    if ( exists $self->_fieldMap->{'dateEnd'} ) {
        my $de = $self->_getByFieldName('dateEnd');
        ( $sdate, $edate ) = $self->_getDates( date_begin => $ds, date_end => $de );
    } else {
        ( $sdate, $edate ) = $self->_getDates( date_begin => $ds );
    }
    return ( $sdate, $edate );
}

sub totalRevenue {
    my $self    = shift;
    my $revenue = $self->_getByFieldName('totalRevenue');
    $revenue =~ s/,//g;
    return $revenue;
}

sub sales {
    my $self    = shift;
    my $sales   = $self->_getByFieldName('netUnits');
    my $revenue = $self->totalRevenue;
    return ( $revenue >= 0 ) ? abs($sales) : 0;
}

sub salesRevenue {
    my $self    = shift;
    my $revenue = $self->totalRevenue;
    return ( $revenue > 0 ) ? $revenue : 0;
}

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

sub returnsRevenue {
    my $self    = shift;
    my $revenue = $self->totalRevenue;
    return ( $revenue < 0 ) ? abs($revenue) : 0;
}

sub albumName { shift->{_albumName}; }

sub artistName { shift->{_artistName}; }

sub _processLine {
    my $self  = shift;
    my $title = $self->_getByFieldName('title');

    if ($title) {
        my ( $artist, $album ) = split( "-", $title );
        $album =~ s/^\s*//;
        $artist =~ s/\s*$//;

        if ( $artist =~ /,/ ) {
            my ( $lastName, $firstName ) = split( ",", $artist );
            $firstName =~ s/^\s*//;
            $artist = "$firstName $lastName";
        }

        ( $self->{_albumName}, $self->{_artistName} ) = ( $album, $artist );
    }

    return $self->SUPER::_processLine(@_);
}

sub free {
    my $self    = shift;
    my $revenue = $self->totalRevenue;
    my $units   = $self->_getByFieldName('netUnits');

    if ( $units && !$revenue ) {
        return '1';
    } else {
        return '0';
    }
}

sub _isValidSaleRecord {
    my $self    = shift;
    my $title   = $self->_getByFieldName('title');
    my $revenue = $self->totalRevenue;
    my $units   = $self->_getByFieldName('netUnits');

    return ( $title && ( $revenue || $units ) );
}

###
1;    # Play nicely.
###
