package RPS::Import::KochPhysArc;

use strict;


use Date::Calc qw(Days_in_Month Decode_Month);

use lib '/app/tools/common/lib';
use Common::Util;
use Common::Consts;

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

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

my %field_map = (
    2 => {
        date                => 0,
        catalog_number      => 0,
        artist_album        => 2,
        sales               => 4,
        returns             => 5,
        sales_revenue       => 7,
        returns_revenue     => 8,
        discount            => 9,
        net_revenue         => 10,
    },
    3 => {
        date                => 0,
        catalog_number      => 0,
        sales               => 1,
        returns             => 2,
        sales_revenue       => 4,
        returns_revenue     => 5,
        discount            => 6,
        net_revenue         => 7,
    },
    4 => {
        date                => 0,
        catalog_number      => 1,
        artist_album        => 2,
        sales               => 4,
        returns             => 6,
        sales_revenue       => 11,
        returns_revenue     => 12,
        discount            => 14,
        net_revenue         => 15,
    },
    5 => {
        date                => 0,
        catalog_number      => 0,
        upc                 => 1,
        artist_album        => 4,
        sales               => 10,
        returns             => 12,
        sales_revenue       => 17,
        returns_revenue     => 19,
        discount            => 21,
        net_revenue         => 24,
    },
    6 => {
        date                => 0,
        catalog_number      => 1,
        upc                 => 2,
        artist_album        => 5,
        sales               => 12,
        returns             => 14,
        sales_revenue       => 19,
        returns_revenue     => 21,
        discount            => 23,
        net_revenue         => 26,
    },
    7 => {
        date                => 0,
        catalog_number      => 1,
        upc                 => 2,
        artist_album        => 5,
        sales               => 9,  # J-K ("UNITS SHIPPED")
        returns             => 11, # L-M ("UNITS RETURNED")
        sales_revenue       => 15, # P   ("DOLLARS SHIPPED")
        returns_revenue     => 16, # Q-R ("DOLLARS RETURNED")
        discount            => 19, # T-U ("DISCOUNT DOLLARS")
        net_revenue         => 22, # W   ("NET DOLLARS")
    },
);

my %product_type_map =
("cd" => RPS::File::Sale::TYPE_CD,
 "dv" => RPS::File::Sale::TYPE_DVD,
 "bo" => RPS::File::Sale::TYPE_CD,
 "mc" => RPS::File::Sale::TYPE_CASS,
 "lp" => RPS::File::Sale::TYPE_LP);

#public methods
my $total_revenue_count;
my $net_revenue_count;
sub _importLines
{
	my $self = shift;
	my %args = @_;

    my $lines = $args{lines};
    my $sheets = $args{sheets};
    my $fileObj = $args{file};
    my $fileName = $fileObj->OrigFileName;
    my $version = $fileObj->VersionNum;
    my $offsets = $field_map{$version};
    my ($dateBegin,$dateEnd);
    my $linenum = 1;

    foreach my $line(@$lines)
    {       
        
        if ($line->[$offsets->{date}] =~ m/Month Period:  (\d+)\D(\d{4})/) {
            my $date = $2 . "-" . $1 . "-01";
            ($dateBegin,$dateEnd) = $self->SUPER::_getDates(date_begin=>$date);
        }
                 
        my $prodtype;
        my $catalog_number      = $line->[$offsets->{catalog_number}];
        my ($artist,$album);
        if($version != 3) {
            ($artist,$album)    = split(":",$line->[$offsets->{'artist_album'}]) 
            if($line->[$offsets->{artist_album}] =~ /\:/);
            
            ($artist,$album)    = split("\/",$line->[$offsets->{'artist_album'}]) 
            if($line->[$offsets->{artist_album}] =~ /\//);
            ($artist,$album)    = split(";",$line->[$offsets->{'artist_album'}]) 
            if($line->[$offsets->{artist_album}] =~ /\;/);
            $album              = $line->[$offsets->{'artist_album'}] 
            if($line->[$offsets->{artist_album}] !~ /\:/);
        }
        
        my $f_product_type = lc $catalog_number;
        
        if($f_product_type =~ /-([a-z]+)-/){
            $prodtype = $product_type_map{$1};            
        }
        
        #$prodtype               = RPS::File::Sale::TYPE_CD if($catalog_number =~ /-CD-/);
        #$prodtype               = RPS::File::Sale::TYPE_DVD if($catalog_number =~ /-DV-/);
        my $sales	    	    = $line->[$offsets->{sales}];
        my $returns             = $line->[$offsets->{returns}];
        my $sales_revenue       = $line->[$offsets->{sales_revenue}];
        
        my $returns_revenue     = $line->[$offsets->{returns_revenue}];
        my $discount            = $line->[$offsets->{discount}];
        $returns                *= -1 if($returns<0);
        $returns_revenue        *= -1 if($returns_revenue<0);

        my $upc;
        if (defined $offsets->{upc})
        {
            $upc = $line->[$offsets->{upc}];
        }
        
        if($sales == 0){
            $returns_revenue          += $discount if($discount>0);
            $returns_revenue            -= ($discount*-1) if($discount<0);
        }
        else{
            $sales_revenue          -= $discount if($discount>0);
            $sales_revenue          += ($discount*-1) if($discount<0);
        }
        
        my $total_revenue       = $sales_revenue - $returns_revenue;
        my $net_revenue         = $line->[$offsets->{net_revenue}];

        if( $f_product_type && 
            ($album || $version == 3 || $artist) && 
            $net_revenue =~ /\d+/)
        {
	        unless ($sales || $returns) {
        	    $self->errstr("Revenue detected on line $linenum with zero net units");
        	    return undef;
    	    }

            unless ($prodtype){
                    $self->errstr("Could not get product type from: ".
                    "$f_product_type at line number: $linenum");
                    
                    print STDERR "Could not get product type from: ".
                    "$f_product_type at line number: $linenum\n";
        	    return undef;
            }
            
	        unless ($dateBegin && $dateEnd) {
        	    $self->errstr("couldn't get dates from $fileName");
        	    return undef;
    	    }
    	    
    	    if(($net_revenue + ($total_revenue * -1)) > .01){
    	        die "Net revenue: $net_revenue does not equal total revenue: $total_revenue";
    	    }
    	    
    	    $total_revenue_count += $total_revenue;
    	    $net_revenue_count += $net_revenue;
    	    
    	    if(($sales == 0) && ($returns == 0)){
    	        if($net_revenue == 0){
    	           $linenum++;
    	           next;
    	        }
    	        elsif($net_revenue < 0){
    	        }
    	        elsif($net_revenue > 0){
    	        }
    	    }
    	    
            my $sale = RPS::Import::SaleRec->new();
            
            $sale->upc($upc);
            $sale->productType($prodtype);
            $sale->dateBegin($dateBegin);
            $sale->dateEnd($dateEnd);
            $sale->artistName($artist);
            $sale->albumName($album);
            $sale->sales($sales);
            $sale->salesRevenue($sales_revenue);
            $sale->returns($returns);
            $sale->returnsRevenue($returns_revenue);
            $sale->channel(RPS::File::Sale::CHANNEL_RETAIL);
            $sale->priceLevel(RPS::File::Sale::PLEVEL_FULL);
            $sale->totalRevenue($total_revenue);
            $sale->serviceProductID($catalog_number);
            $sale->countryCode('US');
            $sale->lineNum($linenum);
    
            $self->_insertSale(sale => $sale);
        }
       #else { print STDERR "skip l:".$linenum." p:".$prodtype." s:". $sales." al:".$album." ar:".$artist." d:".$dateBegin."\n"; }
        $linenum++;
    }
        #print STDERR "Total revenue count: $total_revenue_count net revenue count: $net_revenue_count\n";
	return $linenum;
}

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