package RPS::Import::MusicNow;

use strict;


use Date::Calc qw(Days_in_Month);

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

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

#private constants
use constant FIELD_ISRC			=> 0;
use constant FIELD_UPC			=> 1;
use constant FIELD_ARTIST		=> 2;
use constant FIELD_TRACK		=> 3;
use constant FIELD_ALBUM		=> 4;
use constant FIELD_DATE			=> 5;
use constant FIELD_UNITS		=> 6;
use constant FIELD_PRICE		=> 7;
use constant FIELD_PRODTYPE		=> 10;
use constant FIELD_FORMAT		=> 11;
use constant FIELD_CLIENTALBUMID=> 12;
use constant FIELD_CLIENTTRACKID=> 13;

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};
	my $fileObj = $args{file};
	my $version = $fileObj->VersionNum;

	if ($lines && $version)
	{
		my $dateBegin;
		my $dateEnd;

		($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)
            {
                my $prodtype;
                my $clientID;
                if ($version == 2)
                {
                    if ($line->[FIELD_TRACK] eq "--")
                    {
                        $prodtype = RPS::File::Sale::TYPE_ALBUM;
                    }
                    else
                    {
                        $prodtype = RPS::File::Sale::TYPE_TRACK;
                    }
                }
                else
                {
                    if ($line->[FIELD_PRODTYPE] eq 'A')
                    {
                        $prodtype = RPS::File::Sale::TYPE_ALBUM;
                        $clientID = $line->[FIELD_CLIENTALBUMID];
                    }
                    elsif ($line->[FIELD_PRODTYPE] eq 'T')
                    {
                        $prodtype = RPS::File::Sale::TYPE_TRACK;
                        $clientID = $line->[FIELD_CLIENTTRACKID];
                    }
                }

                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;
                if ($prodtype eq RPS::File::Sale::TYPE_TRACK)
                {
                    $track = $line->[FIELD_TRACK];
                }

                my $format;
                my $free = 0;

                if ($version == 2)
                {
                    $format = RPS::File::Sale::FORMAT_DOWNLOAD;
                }
                else
                {
                    if (uc($line->[FIELD_FORMAT]) eq 'PERM')
                    {
                        $format = RPS::File::Sale::FORMAT_DOWNLOAD;
                    }
                    elsif (uc($line->[FIELD_FORMAT]) eq 'SUBSCRIPTION')
                    {
                        $format = RPS::File::Sale::FORMAT_STREAM;
                    }
                    elsif (uc($line->[FIELD_FORMAT]) eq 'SUBSCRIPTION-FREE TRIAL PERIOD')
                    {
                        $format = RPS::File::Sale::FORMAT_STREAM;
                        $free = 1;
                    }
                }

                my ($units)		= $line->[FIELD_UNITS] =~ m/^(-?\d+)$/;
                my ($price)		= $line->[FIELD_PRICE] =~ m/^(\d*\.?\d*)$/;

                if ($prodtype && $format && $units && $price >= 0 && ($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->units($units);
                    $sale->price($price) unless ($free == 1);
                    $sale->lineNum($linenum);
                    $sale->free($free);
                    $sale->countryCode('US');

                    $self->_insertSale(sale => $sale);
                }
            }
            $linenum++;
        }
        $retval = $linenum;
	}

	return $retval;
}

#
# Private methods
#


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

	my $dateBegin;
	my $dateEnd;

	foreach my $line(@$lines)
	{
		my $year;
		my $month;

		($month, $year) = $line->[FIELD_DATE] =~ m/^(\d?\d)(\d\d\d\d)$/;
		if ($month && $year)
		{
			my $date = sprintf("%04d-%02d-01", $year, $month);

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

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

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

	return ($dateBegin, $dateEnd);
}

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