package RPS::Import::RevolverPhysical;

use strict;

use Date::Calc qw(Days_in_Month Decode_Month Add_Delta_Days);

use lib '/app/tools/common/lib';
#use Common::Util;
use Common::Util qw(normalize_date normalize_isrc);
use Common::Consts qw(%COUNTRY_CODE);

use lib '/app/tools/data_classes/lib';
use Client::Service;

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

my %field_map = (
    2 =>
    {
        client_product_id => 2,
        artist => 3,
        album  => 4,
        product_type => 5,
        units  => 9,
        price  => 12,
        date_begin => 13,
        date_end => 14,       
    },
);

my %product_type = (
'12"' => RPS::File::Sale::TYPE_LP,
'2xcd' => RPS::File::Sale::TYPE_CD,
'2xdvd' => RPS::File::Sale::TYPE_DVD,
'2xlp' => RPS::File::Sale::TYPE_LP,
'3xcd' => RPS::File::Sale::TYPE_CD,
'cd+dvd' => RPS::File::Sale::TYPE_DVD_CD_SET,
'lp' => RPS::File::Sale::TYPE_LP,
'7"' => RPS::File::Sale::TYPE_LP,
'cd' => RPS::File::Sale::TYPE_CD,
# More types added per FB12358
'3xlp' => RPS::File::Sale::TYPE_LP,
'lp+7"' => RPS::File::Sale::TYPE_LP,
'lp+cd' => RPS::File::Sale::TYPE_LP,
'cdep' => RPS::File::Sale::TYPE_CD,
'6xcd' => RPS::File::Sale::TYPE_CD,
'dvd+cd' => RPS::File::Sale::TYPE_DVD_CD_SET,
);

#public methods

sub _importLines
{
    my $self = shift;
    my %args = @_;

    my $lines = $args{lines};
    my $version = $args{file}->VersionNum();
    my $fileName = $args{file}->OrigFileName();
    my @sheets = @{ $args{sheets} };
    my $fileObj = $args{file};
    $fileObj->Physical(1);

    return undef unless ($lines);

    my $gross_total = 0;
    
    my $linenum = 1;
    my $sheetnum = 0;
        
    my $offsets = $field_map{$version};
    my %errors = ();
    
    my ($dateBegin, $dateEnd);
    
    
        
    foreach my $line(@$lines)
    {
        
        my $artist = $line->[$offsets->{artist}];
        my $units = $line->[$offsets->{units}];
        my $price = $line->[$offsets->{price}];
        my $album = $line->[$offsets->{album}];
        my $client_product_id = $line->[$offsets->{client_product_id}];
        my $free = 0;
        
        my $f_type = lc $line->[$offsets->{product_type}];
        my $type = $product_type{$f_type};
        
        my $f_date_begin = $line->[$offsets->{date_begin}];
        my $f_date_end = $line->[$offsets->{date_end}];
        
        ($dateBegin, $dateEnd) = $self->_getDates($f_date_begin, $f_date_end);      

        if($client_product_id && $artist && 
        $album && $units && $price =~ /\d+/) 
        {
            unless ($dateBegin && $dateEnd) {
                $self->errstr("couldn't get dates from $f_date_begin, $f_date_end at row $linenum ");
                print STDERR "$fileName\n";
                return undef;
            }
            
            unless($type){
                $self->errstr("unknown type $f_type at row $linenum ");
                print STDERR "$fileName\n";
                return undef;
            }           
            
            #my $price = ($price / $units) if($units > 0);
            
            if($price == 0){
                $free =  1;
            }
            
            my $sale = RPS::Import::SaleRec->new();

            $sale->clientProductID($client_product_id);           
            $sale->productType($type);
            $sale->dateBegin($dateBegin);
            $sale->dateEnd($dateEnd);
            $sale->artistName($artist);
            $sale->albumName($album);
            $sale->channel(RPS::File::Sale::CHANNEL_RETAIL);
            $sale->priceLevel(RPS::File::Sale::PLEVEL_FULL);

            if ( $units < 0 ) {
                # returns
                $units *= -1;
                $price *= -1 if($price<0);
                $sale->returns($units);
                $sale->returnsRevenue($price);
                $sale->totalRevenue($price*-1);
            } else {
                $sale->sales($units);
                $sale->salesRevenue($price);
                $sale->totalRevenue($price);
            }

            $sale->lineNum($linenum);
            $sale->free($free);
            $sale->countryCode("US"); # all Revolver Physical sales are US (FB12358)
            #$args{dumper}($sale);  ## for cmd-line testing
            $self->_insertSale(sale => $sale);
        }
        
        $linenum++;
    }
    

    return $linenum;
}

#
# Private methods
#


sub _getDates
{
    my $self       = shift;
    my $date_begin = shift;
    my $date_end   = shift;
    
    my ($begin_month, $begin_year, $begin_day, $end_month, $end_year, $end_day);
    
    if($date_begin =~ /\d{4}\D\d{2}\D\d{2}/ && $date_end =~ /\d{4}\D\d{2}\D\d{2}/){
        return ($date_begin, $date_end);
    }
    
    if($date_begin =~ /^(\d+)$/){
        ($begin_year, $begin_month, $begin_day) = 
        Add_Delta_Days(1900, 1, 1, $1 - 2);       	
     }
     else{
	 return undef;
     }
   
     if($date_end =~ /^(\d+)$/){
         ($end_year, $end_month, $end_day) = 
        Add_Delta_Days(1900, 1, 1, $1 - 2);      
         
     }
     else{
         return undef;
     }
     
       
    my $dateBegin = sprintf("%04d-%02d-%02d", $begin_year, $begin_month, $begin_day);
    my $dateEnd   = sprintf("%04d-%02d-%02d", $end_year, $end_month, $end_day);
    
    return ($dateBegin, $dateEnd);    
    
}

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