package RPS::Import::Faithworks;

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 = (
                 1 => {
                        'date_row'          => 3,
                        'date_col'          => 1,
                        'outlet'            => 1,
                        'vendorid'          => 9,
                        'album'             => 11,
                        'retail_price'      => 12,
                        'wholesale_price'   => 13,
                        'units'             => 14,
                        'price'             => 15,
                        },
                 2 => {
                        'date_row'          => 4,
                        'date_col'          => 1,
                        'outlet'            => 1,
                        'vendorid'          => 9,
                        'album'             => 11,
                        'units'             => 14,
                        'price'             => 15,
                        },
                 3 => {
                        'date_row'          => 4,
                        'date_col'          => 2,
                        'vendorid'          => 0,
                        'album'             => 2,
                        'outlet'            => 7,
                        'units'             => 10,
                        'retail_price'      => 8,
                        'wholesale_price'   => 9,
                        'price'             => 11,
                        },
                 4 => {
                        'date_row'          => 3,
                        'date_col'          => 2,
                        'outlet'            => 1,
                        'vendorid'          => 0,
                        'album'             => 16,
                        'retail_price'      => 17,
                        'wholesale_price'   => 18,
                        'units'             => 19,
                        'price'             => 20,
                 },
                 5 => {
                        'date_row'          => 3,
                        'date_col'          => 2,
                        'outlet'            => 1,
                        'vendorid'          => 0,
                        'album'             => 16,
                        'units'             => 17,
                        'wholesale_price'   => 18,
                        'price'             => 20,
                 },

);

#public methods

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

	my $retval = undef;
	my $lines = $args{lines};
    my $fileObj = $args{file};
    my $version = $args{file}->VersionNum();
    my $fileName = $fileObj->OrigFileName;
    #my $version = $args{version}; # for cmd-line testing
    #my $fileName = $args{OrigFileName};
	return undef unless ($lines && $version);

    my $offsets = $field_map{$version};

	my $dateBegin;
	my $dateEnd;

	($dateBegin, $dateEnd) = $self->_getDates($lines->[$offsets->{date_row}]->[$offsets->{date_col}]);

	unless ($dateBegin && $dateEnd)
	{
        $self->errstr("couldn't get dates from ".($lines->[$offsets->{date_row}]->[$offsets->{date_col}]));
        return undef;
    }

    my $outlet = "";
    my $album  = "";

    my $linenum = 1;
    foreach my $line(@$lines)
    {
        my $prodtype  = RPS::File::Sale::TYPE_PHYSICAL;
        my $price_level = RPS::File::Sale::PLEVEL_UNKNOWN;
        my $channel = RPS::File::Sale::CHANNEL_RETAIL;
        my $vendorID  = $line->[$offsets->{vendorid}];
        if ($version < 3) {
            ## versions that have albums grouped under outlets
            if ($line->[$offsets->{outlet}] ne "") {
                $outlet = $line->[$offsets->{outlet}];
                $linenum++;
                next;
            }
            $album = $line->[$offsets->{album}];
        } elsif($version==3) {
            ## versions that have outlets grouped under albums
            if ($line->[$offsets->{album}] ne "") {
                $album = $line->[$offsets->{album}];
                $linenum++;
                next;
            }
            $outlet = $line->[$offsets->{outlet}];
        }
        elsif($version>3) {
                $album = $line->[$offsets->{album}];
                $outlet = $line->[$offsets->{outlet}];
        }


        $album =~ s/\s*\(CD\)$//;

        my ($units)	         = $line->[$offsets->{units}] =~ m/^(-?[,0-9]+)$/;
        my ($price)          = $line->[$offsets->{price}] =~ m/^(-?[,0-9]*\.?[,0-9]*)$/;
        my ($price) 	     = $line->[$offsets->{price}] =~ m/^(-?[,0-9]*\.?[,0-9]*)$/;
        my ($retailPrice) 	 = $line->[$offsets->{retail_price}] if( $offsets->{retail_price} );
        my ($wholesalePrice) = $line->[$offsets->{wholesale_price}];

        $retailPrice /= $units if( $version == 4 && $units > 0 );
	    $retailPrice *= -1 if( $version == 4 && $units < 0 );

        # stupid commas!
        $units =~ s/,//g;
        $price =~ s/,//g;
        if ($prodtype && $units && $album) {
            my $sale = RPS::Import::SaleRec->new();

            $sale->productType($prodtype);
            $sale->dateBegin($dateBegin);
            $sale->dateEnd($dateEnd);
            $sale->serviceProductID($vendorID);
            $sale->albumName($album);
            $sale->retailPrice($retailPrice);
            $sale->wholesalePrice($wholesalePrice);
            $sale->outlet($outlet);

            if ($units < 0)
            {
                $sale->returns(-1 * $units);
                $sale->returnsRevenue(-1 * $price);
            }
            else
            {
                $sale->sales($units);
                $sale->salesRevenue($price);
            }
            $sale->totalRevenue($price);
            $sale->priceLevel($price_level);
            $sale->channel($channel);
            $sale->countryCode('US');
            $sale->lineNum($linenum);

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

	return $linenum;
}

#
# Private methods
#


sub _getDates
{
	my $self = shift;
	my $date = shift;

    $date =~ m/^Report (?:for the )?period (\d{2})-([A-Z]{3})-(\d{4}) to (\d{2})-([A-Z]{3})-(\d{4})$/i;

    my $dateBegin = sprintf("%04d-%02d-%02d", $3, Decode_Month($2), $1);
    my $dateEnd   = sprintf("%04d-%02d-%02d", $6, Decode_Month($5), $4);

    return undef if ($dateBegin eq "0000-00-00" || $dateEnd eq "0000-00-00");

    return $self->SUPER::_getDates(date_begin => $dateBegin, date_end => $dateEnd);
#    ($dateBegin, $dateEnd) = Common::Util::normalize_sales_month_dates($dateBegin, $dateEnd) if ($dateBegin && $dateEnd);

#	return ($dateBegin, $dateEnd);
}

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