package RPS::Import::Real;

use strict;


use Date::Calc qw(Days_in_Month);

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

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

#private constants
use constant FIELD_LABEL_ALT    => 1;
use constant FIELD_LABEL		=> 1;
use constant FIELD_ARTIST		=> 2;
use constant FIELD_ALBUM		=> 3;
use constant FIELD_TRACK		=> 4;
use constant FIELD_UPC			=> 5;
use constant FIELD_TRACKNUM		=> 7;
use constant FIELD_ISRC			=> 8;
use constant FIELD_UNITS		=> 9;
use constant FIELD_PRICE		=> 10;
use constant FIELD_PRODTYPE		=> 12;
use constant FIELD_ALBUMID		=> 13;
use constant FIELD_TRACKID		=> 14;
use constant FIELD_CATALOGID	=> 15;
use constant FIELD_DATEBEGIN	=> 16;
use constant FIELD_DATEEND		=> 17;

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 $retval = undef;
	my $lines = $args{lines};

	if ($lines)
	{
		my $dateBegin;
		my $dateEnd;
		my $format;

		#($dateBegin, $dateEnd) = $self->_getDates($lines);

#		unless ($dateBegin && $dateEnd)
#        {
#            $self->errstr("couldn't get dates");
#            return undef;
#        }

        my $linenum = 1;
        foreach my $line(@$lines)
        {
            if ($linenum > 1)
            {
                ($dateBegin, $dateEnd) = $self->_getDates(date_begin => $line->[FIELD_DATEBEGIN], date_end => $line->[FIELD_DATEEND]);

                my $prodtype;
                my $clientID;
                if ($line->[FIELD_PRODTYPE] eq 'A')
                {
                    $prodtype = RPS::File::Sale::TYPE_ALBUM;
                    $clientID = $line->[FIELD_ALBUMID];
                    $format	  = RPS::File::Sale::FORMAT_DOWNLOAD;
                }
                elsif ($line->[FIELD_PRODTYPE] eq 'T')
                {
                    $prodtype = RPS::File::Sale::TYPE_TRACK;
                    $clientID = $line->[FIELD_TRACKID];
                    $format	  = RPS::File::Sale::FORMAT_DOWNLOAD;
                }
                elsif ($line->[FIELD_PRODTYPE] eq 'S')
                {
                    $prodtype = RPS::File::Sale::TYPE_TRACK;
                    $clientID = $line->[FIELD_TRACKID];
                    $format	  = RPS::File::Sale::FORMAT_STREAM;
                }
                elsif( $line->[FIELD_PRODTYPE] )
				{
					die "Unable to determine product type from '$line->[FIELD_PRODTYPE]' (line: $linenum)";
				}

                my $upc			= Common::Util::normalize_upc($line->[FIELD_UPC]);
                my $isrc		= Common::Util::normalize_isrc($line->[FIELD_ISRC]);
                my $artist		= $line->[FIELD_ARTIST];
                my $album		= $line->[FIELD_ALBUM];
                my $track		= $line->[FIELD_TRACK];
                my $label		= $line->[FIELD_LABEL] || $line->[FIELD_LABEL_ALT];
                my ($trackNum)	= $line->[FIELD_TRACKNUM] =~ m/^(\d+)$/;
                my ($units)		= $line->[FIELD_UNITS] =~ m/^(-?\d+)$/;
                my ($neg, $price) = $line->[FIELD_PRICE] =~ m/^(-?)(\d*\.?\d*)$/;
                if ($neg && $units > 0)
                {
                    $units = -$units;
                }

                my $country = 'US';

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

                    $sale->productType($prodtype);
                    $sale->formatType($format);
                    $sale->dateBegin($dateBegin);
                    $sale->dateEnd($dateEnd);
                    $sale->clientProductID($clientID);
                    $sale->upc($upc);
                    $sale->isrc($isrc);
                    $sale->artistName($artist);
                    $sale->albumName($album);
                    $sale->trackName($track);
                    $sale->labelName($label);
                    $sale->trackNum($trackNum);
                    $sale->units($units);
                    $sale->price($price);
                    $sale->lineNum($linenum);
                    $sale->countryCode($country);

                    $self->_insertSale(sale => $sale);
                }
				else {
					Log->warn( "Ingoring line: $linenum" );
				}
            }
            $linenum++;
        }
        $retval = $linenum;
    }

	return $retval;
}

#
# Private methods
#

sub __getDates
{
	my $self = shift;
	my $lines = shift;

	my $dateBegin;
	my $dateEnd;

	foreach my $line(@$lines)
	{
		my $date = Common::Util::normalize_date($line->[FIELD_DATEBEGIN]);

		if ($date)
		{
			if ($date < $dateBegin || !$dateBegin)
			{
				$dateBegin = $date;
			}
		}

		$date = Common::Util::normalize_date($line->[FIELD_DATEEND]);

		if ($date)
		{
			if ($date > $dateEnd || !$dateEnd)
			{
				$dateEnd = $date;
			}
		}
	}

	if ($dateBegin)
	{
		substr($dateBegin, 8) = "01";
	}

	if ($dateEnd)
	{
		substr($dateEnd, -2) = Days_in_Month(substr($dateEnd, 0, 4), substr($dateEnd, 5, 2));
	}

	return ($dateBegin, $dateEnd);
}

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