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,
        label_name      => 1,
    },
    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;
    my $labelName;

    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;
        $labelName         = $line->[ $offsets->{label_name} ] if $linenum == 1;

        # 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');
            $sale->labelName($labelName);
            $sale->serviceID( Client::Service::DSP_AMAZON );

            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.
###
