package RPS::Import::SelectPhysical;

use strict;

use Data::Dumper;
use lib '/app/tools/common/lib';
use Common::Util qw(normalize_upc normalize_isrc);
use Date::Calc qw(Days_in_Month);

use lib '/app/tools/data_classes/lib';

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

sub _headerIdentifier { ( dateBegin => 'PERIODE DE' ) }
sub physical { 1 }

sub _fieldMap {
    my $self = shift;
    
    my %fieldMap =
    (
        1 => {
            dateBegin        => 'P',
            dateEnd          => 'Q',
            productType      => 'E',
            artistName       => 'C',
            serviceProductID => 'A',
            albumName        => 'D',
            wholesalePrice   => 'G',
            retailPrice      => 'F',
            sales            => 'X',
            returns          => 'X',
            totalRevenue     => 'Z',             
        },
        2 => {
            dateBegin        => 'Q',
            dateEnd          => 'R',
            productType      => 'F',
            artistName       => 'D',
            serviceProductID => 'A',
            upc              => 'B',
            albumName        => 'E',
            wholesalePrice   => 'H',
            retailPrice      => 'G',
            sales            => 'Y',
            returns          => 'Y',
            totalRevenue     => 'AA',             
        },
    );         
        
    return $fieldMap{$self->_version()};
}

sub _unverifiedFieldMap {
    my $self = shift;
    
    my %fieldMap =
    (
        1 => {
            promoUnits     => 'S',
            freeUnits      => 'T',
        },
        2 => {
            promoUnits     => 'T',
            freeUnits      => 'U',
        },
    );         
        
    return $fieldMap{$self->_version()};
}

sub channel      { RPS::File::Sale::CHANNEL_RETAIL }
sub priceLevel   { RPS::File::Sale::PLEVEL_FULL }
sub countryCode  { 'CA' }
sub currencyCode { 'CAD' }

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

    if( $productType =~ /12 POUCES/i )
    {
        return RPS::File::Sale::TYPE_LP;
    }
    elsif( $productType =~ /MICROSILLON/i )
    {
        return RPS::File::Sale::TYPE_LP;
    } 
    #elsif( $productType =~ /LIVRE/i )
    #{
    #    return RPS::File::Sale::TYPE_BOOK;
    #}        
    elsif( $productType =~ /45 TOURS/i )
    {
        return RPS::File::Sale::TYPE_LP5;
    }
    elsif( $productType =~ /COMPACT DISC/i )
    {
        return RPS::File::Sale::TYPE_CD;
    }  
    elsif( $productType =~ /DVD\/CD/i )
    {
        return RPS::File::Sale::TYPE_DVD_CD_SET;
    }      
    
    $self->fail("Unknown product type $productType ");  
}

sub sales {
    my $self = shift;
    my $sales = $self->_getByFieldName( 'sales' );
    $sales = $self->_formatUnits($sales);

    return ( $sales > 0 ) ? $sales : 0;
}

sub salesRevenue {
    my $self = shift;
    my $revenue = $self->totalRevenue;

    return ( $revenue > 0 ) ? $revenue : 0;
}

sub returns {
    my $self = shift;
    my $returns = $self->_getByFieldName( 'returns' );
    $returns = $self->_formatUnits($returns);

    return ( $returns < 0 ) ? abs($returns) : 0;
}

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

sub totalRevenue {
    my $self = shift;
    my $revenue = $self->_getByFieldName( 'totalRevenue' );
    $revenue = $self->_formatRevenue($revenue);
    
    return $revenue;
}

sub wholesalePrice {
    my $self = shift;
    my $price = $self->_getByFieldName( 'wholesalePrice' );
    $price = $self->_formatRevenue($price);
    
    return $price;
}

sub retailPrice {
    my $self = shift;
    my $price = $self->_getByFieldName( 'retailPrice' );
    $price = $self->_formatRevenue($price);
    
    return $price;
}

sub _saveLine {
    my $self = shift;

	# We may need to save three lines to the database for one line in the file.
	# One for regular units, one for promo units, and one for free units.
	if ($self->sales != 0 || $self->returns != 0)
	{
	    # This is for the regular units
		$self->SUPER::_saveLine();
	}

	my $promoUnits = $self->_getByFieldName('promoUnits');
	
	if ($promoUnits != 0) {
	    $promoUnits = $self->_formatUnits($promoUnits);
	    
        my ($startDate, $endDate) = $self->saleDates();
     
        my $sale = RPS::Import::SaleRec->new();
        
        $sale->units($promoUnits);
        $sale->price(0);        
        
        if ($promoUnits < 0) {
            $sale->returns( abs($promoUnits) );          
            $sale->sales( 0 );
        } else {
            $sale->returns( 0 );          
            $sale->sales( $promoUnits );            
        }        
        
        $sale->salesRevenue( 0 ); 
        $sale->returnsRevenue( 0 );  
        $sale->totalRevenue( 0 );
        
        $sale->priceLevel( RPS::File::Sale::PLEVEL_PROMO );                     
    
        $sale->dateBegin($startDate);
        $sale->dateEnd($endDate);

    	$sale->mediaType(           $self->mediaType);
        $sale->productType(         $self->productType);
        $sale->formatType(          $self->formatType);
        $sale->albumName(           $self->albumName );
        $sale->artistName(          $self->artistName );
        $sale->averagePrice(        $self->averagePrice );
        $sale->channel(             $self->channel );
        $sale->clientProductID(     $self->clientProductID );
        $sale->configuration(       $self->configuration );
        $sale->conversionRate(      $self->conversionRate );
        $sale->countryCode(         $self->countryCode );
        $sale->currencyCode(        $self->currencyCode );
        $sale->free(                $self->free );
        $sale->importStatus(        $self->importStatus );
        $sale->isrc(                $self->isrc );
        $sale->labelName(           $self->labelName );
        $sale->outlet(              $self->outlet );
        $sale->payoutType(          $self->payoutType );
        $sale->wholesalePrice(      $self->wholesalePrice );
        $sale->retailPrice(         $self->retailPrice );
        $sale->priceType(           $self->priceType );
        $sale->retail(              $self->retail );
        $sale->serviceID(           $self->serviceID );
        $sale->serviceProductID(    $self->serviceProductID );
        $sale->trackName(           $self->trackName );
        $sale->trackNum(            $self->trackNum );
        $sale->upc(                 $self->upc );
        $sale->wholesaleRate(       $self->wholesaleRate );
        $sale->mcps_adjustment(     $self->mcps_adjustment );
        $sale->comments(            $self->comments );
    
    	$sale->lineNum( $self->linenum );
    
        $self->_insertSale(sale => $sale);	       
	}
	
    my $freeUnits = $self->_getByFieldName('freeUnits');
	
	if ($freeUnits != 0) {
	    $freeUnits = $self->_formatUnits($freeUnits);
	    
        my ($startDate, $endDate) = $self->saleDates();
     
        my $sale = RPS::Import::SaleRec->new();
        
        $sale->units($freeUnits);
        $sale->price(0);        
        
        if ($freeUnits < 0) {
            $sale->returns( abs($freeUnits) );          
            $sale->sales( 0 );
        } else {
            $sale->returns( 0 );          
            $sale->sales( $freeUnits );            
        }        
        
        $sale->salesRevenue( 0 ); 
        $sale->returnsRevenue( 0 );  
        $sale->totalRevenue( 0 );
        
        $sale->free( 1 );
        
        $sale->priceLevel( RPS::File::Sale::PLEVEL_PROMO );                     
    
        $sale->dateBegin($startDate);
        $sale->dateEnd($endDate);

    	$sale->mediaType(           $self->mediaType);
        $sale->productType(         $self->productType);
        $sale->formatType(          $self->formatType);
        $sale->albumName(           $self->albumName );
        $sale->artistName(          $self->artistName );
        $sale->averagePrice(        $self->averagePrice );
        $sale->channel(             $self->channel );
        $sale->clientProductID(     $self->clientProductID );
        $sale->configuration(       $self->configuration );
        $sale->conversionRate(      $self->conversionRate );
        $sale->countryCode(         $self->countryCode );
        $sale->currencyCode(        $self->currencyCode );       
        $sale->importStatus(        $self->importStatus );
        $sale->isrc(                $self->isrc );
        $sale->labelName(           $self->labelName );
        $sale->outlet(              $self->outlet );
        $sale->payoutType(          $self->payoutType );
        $sale->wholesalePrice(      $self->wholesalePrice );
        $sale->retailPrice(         $self->retailPrice );
        $sale->priceType(           $self->priceType );
        $sale->retail(              $self->retail );
        $sale->serviceID(           $self->serviceID );
        $sale->serviceProductID(    $self->serviceProductID );
        $sale->trackName(           $self->trackName );
        $sale->trackNum(            $self->trackNum );
        $sale->upc(                 $self->upc );
        $sale->wholesaleRate(       $self->wholesaleRate );
        $sale->mcps_adjustment(     $self->mcps_adjustment );
        $sale->comments(            $self->comments );
    
    	$sale->lineNum( $self->linenum );
    
        $self->_insertSale(sale => $sale);	       
	}	
}

sub _isValidSaleRecord {
	my $self = shift;
	
	my $promoUnits = $self->_getByFieldName('promoUnits');
	my $freeUnits  = $self->_getByFieldName('freeUnits');
	my $regularUnits = $self->_getByFieldName('sales');
	my $revenue = $self->totalRevenue;

	return ( $regularUnits || $promoUnits || $freeUnits || $revenue );
}

sub _formatUnits {
    my ($self, $units) = @_;
    
    if ($units =~ /^- (\d+)$/) {
        $units = $1 * -1;
    }
    
    return $units;
}

sub _formatRevenue {
    my ($self, $revenue) = @_;
    
    if ($revenue =~ /^- (\d+),(\d{2})$/) {
        $revenue = $1 . "." . $2;
        $revenue *= -1;
    } elsif ($revenue =~ /^(\d+),(\d{2})$/) {
        $revenue = $1 . "." . $2;
    }
    
    return $revenue;
}


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