package RPS::Import::AmazonPhys;
use strict;

use Date::Calc qw(Days_in_Month Decode_Month);

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

use lib '/app/tools/common/lib';
use Common::Util qw(normalize_upc);

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

my %field_map = (
    4 => {
        date               => 0,
        upc                => 1,
        svc_prod_id        => 2,
        album              => 3,
        units              => 4,
        retail_price       => 5,
        wholesale_price    => 7,
        price              => 8,
    },
    5 => {
        date               => 0,
        upc                => 1,
        svc_prod_id        => 2,
        album              => 3,
        units              => 6,
        retail_price       => 4,
        wholesale_price    => 7,
        price              => 8,
    },
    9 => {
        date               => 0, # A
        upc                => 1, # B
        sale_type          => 2, # C
        svc_prod_id        => 4, # E
        album              => 5, # F
        units              => 6, # G
        price              => 21, # V
    },
);

sub _importLines
{
    my $self    = shift;
    my %args    = @_;
    my $lines   = $args{lines};
    my $version = $self->_version();
    my $offsets = $field_map{$version};

    return 0 unless $lines;

    $args{file}->Physical(1);

    my $price_level = RPS::File::Sale::PLEVEL_FULL;
    my $channel     = RPS::File::Sale::CHANNEL_RETAIL;

    my $linenum = 1;
    foreach my $line(@$lines)
    {
        my $album   = $line->[$offsets->{album}];
        my $track   = (defined $offsets->{track}) ? $line->[$offsets->{track}] : undef;
        my $price   = $self->numeric($line->[$offsets->{price}]);
        my $units   = $self->numeric($line->[$offsets->{units}]);
        my $upc     = normalize_upc($line->[$offsets->{upc}]);
        my $svcProdID = $line->[$offsets->{svc_prod_id}];
        my $date    = $line->[$offsets->{date}];
        my $retailPrice    = (defined $offsets->{retail_price}) ? $line->[$offsets->{retail_price}] : undef;
        my $wholesalePrice = (defined $offsets->{wholesale_price}) ? $line->[$offsets->{wholesale_price}] : undef;
        my $saleType       = (defined $offsets->{sale_type}) ? $line->[$offsets->{sale_type}] : undef;

        # skip line if sale type is defined and it's not order or refund
        #
        my $skipLine = ($saleType && ($saleType !~ /(order|refund)/i)) ? 1 : 0;

        if (!$skipLine && $price && $units && ($track || $album || $upc) && lc $date ne 'sub total')
        {
            my ($dateBegin,$dateEnd) = _getDates($date);
            unless ($dateBegin && $dateEnd)
            {
                $self->errstr("couldn't get dates");
                print STDERR "date: $date\n";
                return undef;
            }

            my $sale = RPS::Import::SaleRec->new();

            $sale->dateBegin($dateBegin);
            $sale->dateEnd($dateEnd);
            $sale->serviceProductID($svcProdID);
            $sale->albumName($album);
            $sale->trackName($track) if( $track );
            $sale->retailPrice($retailPrice) if( $retailPrice );
            $sale->wholesalePrice($wholesalePrice) if( $wholesalePrice );
            $sale->upc($upc);
            $sale->productType(RPS::File::Sale::TYPE_CD);
            $sale->priceLevel($price_level);
            $sale->channel($channel);
            $sale->lineNum($linenum);
            $sale->countryCode('US');
            $sale->currencyCode('USD');

            if ($units < 0)
            {
                $sale->returns($units * -1);

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

            $self->_insertSale(sale => $sale);
        }
        #else { print STDERR "skip: ($linenum) p: $price u: $units t: $track a: $album\n"; }
        $linenum++;
    }
    return $linenum;
}

#
# Private methods
#


sub _getDates
{
    my $date = shift;
    my ($month, $year);

    # 01/Apr/2008
    if ($date =~ m/\d+\D(\w+)\D(\d{4})/)
    {
        my $monthName = $1;
        $year = $2;
        $month = Decode_Month($monthName);
        unless ($month)
        {
            print STDERR "bad month? $monthName\n";
            return;
        }
    }
    elsif ($date =~ m/(\w+)\D\d+\D(\d{4})/)
    {
        my $monthName = $1;
        $year = $2;
        $month = Decode_Month($monthName);
        unless ($month)
        {
            print STDERR "bad month? $monthName\n";
            return;
        }
    }
    elsif ($date =~ m/^\d+$/) # stoopid excel date format
    {
        ($year, $month) = Import::Importer->numericToDate($date);
    }
    elsif( $date =~ /^\d{4}-\d{2}-\d{2}$/ )
    {
        return Import::Importer->_getDates( date_begin => $date );
    }
    else { return undef; }

    return (
        sprintf("%04d-%02d-01", $year, $month),
        sprintf("%04d-%02d-%02d", $year, $month, Days_in_Month($year, $month)),
    );
}

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