package RPS::Import::RSFormat;

use strict;


use Date::Calc qw(Days_in_Month Add_Delta_Days);

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

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

# map version num to the field order
my %fieldMap =
(
	#1 =>
	#{
	#	'service'		=> 0,
	#	'country'		=> 1,
	#	'period'		=> 2,
	#	'label'			=> 3,
	#	'artist'		=> 4,
	#	'catno'			=> 5,
	#	'album'			=> 6,
	#	'upc'   		=> 7,
	#	'track'   		=> 8,
	#	'isrc'   		=> 9,
	#	'ptype'	    	=> 10,
	#	'format'		=> 11,
	#	'units'			=> 12,
	#	'price'	    	=> 13,
	#},
	1 =>
	{
		'country'		=> 0,
		'period'		=> 1,
		'artist'		=> 2,
		'catno'			=> 3,
		'album'			=> 4,
		'upc'   		=> 5,
		'units'			=> 6,
		'price'	    	=> 7,
		'format'	   	=> 9,
	},
);

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

#public methods

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

	my $lines = $args{lines};
	my $fileObj = $args{file};
	my $version = $fileObj->VersionNum;
    ##my $version = $args{version}; # for cmd-line testing

    return undef unless (defined $lines && defined $version);

	my $dateBegin;
	my $dateEnd;
	my $offsets;

	if (exists $fieldMap{$version}) {
		$offsets = $fieldMap{$version};
	} else {
        $self->errstr('wrong version');
		return 0;
	}

    my $prev_generic_type;

    my $linenum = 2;
    shift @$lines; ## skip header
    foreach my $line (@$lines)
    {
        if ($line->[$offsets->{country}] eq '') {
            $linenum++;
            next;
        }

        my $price_level = RPS::File::Sale::PLEVEL_UNKNOWN;
        my $channel     = RPS::File::Sale::CHANNEL_RETAIL;
        my ($config, $format, $prodtype, $service);

        
        if ($line->[$offsets->{format}] =~ m/dvd/i) {
            $config   = "DVD";
            $prodtype = RPS::File::Sale::TYPE_DVD;
        } else {
            $config   = "CD";
            $prodtype = RPS::File::Sale::TYPE_CD;
        }
        $service  = Client::Service::DSP_RSFORMATPHYSICAL;
        


        my $catno   	= $line->[$offsets->{catno}];
        my $upc			= Common::Util::normalize_upc($line->[$offsets->{upc}]);
        my $artist		= $line->[$offsets->{artist}];
        my $album		= $line->[$offsets->{album}];
        my $countryCode	= $Common::Consts::COUNTRY_CODE{lc $line->[$offsets->{country}]};


        my ($track, $label, $isrc);
       

        ($dateBegin, $dateEnd) = $self->_getDates($line->[$offsets->{period}]);

#        unless (defined $dateBegin && defined $dateEnd) {
#            $self->errstr("couldn't get dates from ".$line->[$offsets->{period}]);
#            return undef;
#        }

        my ($units)	= $line->[$offsets->{units}] =~ m/^(-?\d+)$/;
        my ($price)	= $line->[$offsets->{price}] =~ m/^(-?\d*\.?\d*)$/;
       
        if ($prodtype && $service && $units && $price && $album)
        {
            my $sale = RPS::Import::SaleRec->new();

            $sale->serviceID($service);
            $sale->productType($prodtype);
            $sale->formatType($format);
            $sale->dateBegin($dateBegin);
            $sale->dateEnd($dateEnd);
            $sale->clientProductID($catno);
            $sale->upc($upc);
            $sale->isrc($isrc);
            $sale->artistName($artist);
            $sale->albumName($album);
            $sale->trackName($track);
            $sale->labelName($label);
            $sale->sales($units);
            $sale->salesRevenue($price);
            $sale->totalRevenue($price);
            $sale->priceLevel($price_level);
                $sale->channel($channel);
                $sale->configuration($config);
            
            $sale->countryCode($countryCode);
            $sale->lineNum($linenum);

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

    $fileObj->Physical(1);
    $fileObj->Save();
    
    return $linenum;
}

#
# Private methods
#


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

	my $beginDate;
	my $endDate;

    my $type;
    if ($date =~ m/^Q([1234])(\d\d)$/) {
        $type = 'quarter';
#        my $qtr  = $1;
#        my $year = $2 + 2000;
#        if ($qtr == 1) {
#            $beginDate = $year."-01-01";
#            $endDate = $year."-03-".Days_in_Month($year, 3);
#        } elsif ($qtr == 2) {
#            $beginDate = $year."-04-01";
#            $endDate = $year."-06-".Days_in_Month($year, 6);
#        } elsif ($qtr == 3) {
#            $beginDate = $year."-07-01";
#            $endDate = $year."-09-".Days_in_Month($year, 9);
#        } elsif ($qtr == 4) {
#            $beginDate = $year."-10-01";
#            $endDate = $year."-12-".Days_in_Month($year, 12);
#        }
#	    return ($beginDate, $endDate);
    } elsif ($date =~ m/^(\d{4}-\d\d-\d\d)$/) {
        $type = 'iso';
#	    return ($1, $1);
    } elsif ($date =~ m/^(\d+)\/(\d+)\/(\d{4})$/) {
        $type = 'eur';
#        my $tmp = sprintf("%04d-%02d-%02d", $3, $2, $1);
#	    return ($tmp, $tmp);
    } elsif ($date =~ m/^(\d+)$/) {
        ## stupid excel dates...
        $type = 'msft';
#        my ($year, $month, $day) = Add_Delta_Days(1900,1,1, $1 - 2);
#        my $tmp = sprintf("%d-%02d-%02d", $year, $month, $day);
#	    return ($tmp, $tmp);
    }
    return $self->SUPER::_getDates(date_begin => $date, type => $type);
}

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