package RPS::Import::Fusion;

use strict;

use Data::Dumper;
use Date::Calc qw(Days_in_Month Decode_Month);

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

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';

use constant DATE_ROW       => 3;
use constant DATE_START_COL => 14;
use constant DATE_END_COL   => 18;

use constant FIELD_CATNO     => 0;
use constant FIELD_ALBUM     => 1;
use constant FIELD_FORMAT    => 2;
use constant FIELD_SALES     => 10;
use constant FIELD_RETURNS   => 11;
use constant FIELD_DEFECTS   => 12;
use constant FIELD_RETAIL    => 14;
use constant FIELD_WHOLESALE => 18;
use constant FIELD_PRICE     => 19;
use constant FIELD_TOTAL     => 20;

#public methods

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

    my $retval = undef;
    my $sheets = $args{sheets};

    my $linenum;

    foreach my $sheet (@$sheets) {

        #for (my $i = 0; $i < 20; $i++) {
        #print "line $i: ".$sheet->[$i]->[DATE_START_COL]."\n";
        #}
        #print "\n";
        #next;

        my ( $dateBegin, $dateEnd ) = $self->_getDates( $sheet->[DATE_ROW]->[DATE_START_COL], $sheet->[DATE_ROW]->[DATE_END_COL] );

        unless ( $dateBegin && $dateEnd ) {
            $self->errstr( "couldn't get dates from " . $sheet->[DATE_ROW]->[DATE_START_COL] );
            print STDERR "couldn't get dates from " . $sheet->[DATE_ROW]->[DATE_START_COL] . "\n";
            return undef;
        }

        my $comp_date = $dateBegin;
        $comp_date =~ s/\-//g;

        $linenum = 1;
        $linenum = 10 if ( $comp_date > 200706 );
        my $prev_catno  = "";
        my $prev_album  = "";
        my $prev_format = "";
        foreach my $line (@$sheet) {
            my $prodtype    = RPS::File::Sale::TYPE_PHYSICAL;
            my $price_level = RPS::File::Sale::PLEVEL_UNKNOWN;
            my $channel     = RPS::File::Sale::CHANNEL_RETAIL;
            my $catno       = $line->[FIELD_CATNO];
            my $album       = $line->[FIELD_ALBUM];
            my $format      = $line->[FIELD_FORMAT];

            my ($sales)           = $line->[FIELD_SALES] =~ m/^(-?\d+)$/;
            my ($returns)         = $line->[FIELD_RETURNS] =~ m/^(-?\d+)$/;
            my ($defects)         = $line->[FIELD_DEFECTS] =~ m/^(-?\d+)$/;
            my ($price)           = $line->[FIELD_PRICE] =~ m/^(-?\d*\.?\d*)$/;
            my ($total_price)     = $line->[FIELD_TOTAL] =~ m/^(-?\d*\.?\d*)$/;
            my ($retail_price)    = $line->[FIELD_RETAIL] =~ m/^(-?\d*\.?\d*)$/;
            my ($wholesale_price) = $line->[FIELD_WHOLESALE] =~ m/^(-?\d*\.?\d*)$/;

            # 'defects' is used just to reduce the number of sales.
            # but they aren't really returns.
            $sales -= $defects;
            $sales = 0 if $sales < 0;

            if ( ( $sales || $returns ) && $catno eq "" ) {

                #print STDERR "got one: $prev_catno / $prev_album / $prev_format\n";
                $catno  = $prev_catno;
                $album  = $prev_album;
                $format = $prev_format;
            }

            my $sales_price   = $sales * $price;
            my $returns_price = $returns * $price;

            if ( $prodtype && ( $sales || $returns ) && $album ) {
                my $sale = RPS::Import::SaleRec->new();

                $sale->productType($prodtype);
                $sale->dateBegin($dateBegin);
                $sale->dateEnd($dateEnd);
                $sale->clientProductID($catno);
                $sale->albumName($album);
                $sale->sales($sales);
                $sale->retailPrice($retail_price);
                $sale->wholesalePrice($wholesale_price);
                $sale->salesRevenue($sales_price);
                $sale->returns($returns);
                $sale->returnsRevenue($returns_price);
                $sale->totalRevenue($total_price);
                $sale->priceLevel($price_level);
                $sale->channel($channel);
                $sale->configuration($format);
                $sale->countryCode('CA');
                $sale->currencyCode('CAD');
                $sale->lineNum($linenum);

                #$args{dumper}($sale);  ## for cmd-line testing
                $self->_insertSale( sale => $sale );
            }

            #else { print STDERR "skipping $linenum: $catno\n"; }
            $prev_catno  = $catno;
            $prev_album  = $album;
            $prev_format = $format;
            $linenum++;
        }
    }

    return $linenum;
}

#
# Private methods
#

sub _getDates {
    my $self  = shift;
    my $date1 = shift;
    my $date2 = shift;

    if ( $date1 =~ m/^\d{4}-\d{2}-\d{2}$/ && $date2 =~ m/^\d{4}-\d{2}-\d{2}$/ ) {
        return ( $date1, $date2 );
    } else {
        return undef;
    }
}

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