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',
            serviceProductID => 'J',
            retailPrice      => 'N',
        },        
        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.
###
