package RPS::Import::Calabash;

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

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

#private constants
use constant FIELD_ALBUM  => 0;
use constant FIELD_TRACK  => 1;
use constant FIELD_PRICE  => 2;
use constant FIELD_UNITS  => 3;

#public methods

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

	my $sheets = $args{sheets};
	my $sheet_names = $args{sheet_names};

	return 0 unless ($sheets);

    my $prodtype = RPS::File::Sale::TYPE_TRACK;
    my $format   = RPS::File::Sale::FORMAT_DOWNLOAD;
    
    my $linenum;

    for (my $sheet_i = 0; $sheet_i < @$sheets; $sheet_i++) {
        my $sheet = $sheets->[$sheet_i];
        my $sheet_name = $sheet_names->[$sheet_i];

        next if ($sheet_name eq "Overview");

        my ($dateBegin, $dateEnd) = $self->_getDates($sheet_name);

        unless ($dateBegin && $dateEnd) {
            $self->errstr("couldn't get dates");
            print STDERR "date source: $sheet_name\n";
            return undef;
        }

        $linenum = 0;
        my $album = "";

	    foreach my $line (@$sheet)
	    {
            if (($line->[FIELD_ALBUM] eq '' && $line->[FIELD_TRACK] eq 'Sub total') ||
                ($line->[FIELD_ALBUM] eq 'Total' && $line->[FIELD_TRACK] eq '') ||
                $linenum == 0) {
                $linenum++;
                next;
            }

            my $tracknum = undef;

            if ($line->[FIELD_ALBUM] ne '' && $line->[FIELD_TRACK] eq '' &&
                $line->[FIELD_UNITS] eq '' && $line->[FIELD_PRICE] eq '') {
		        $album	= $line->[FIELD_ALBUM];
                next;
            } else {
		        $tracknum	= $line->[FIELD_ALBUM];
            }
		    my $track	= $line->[FIELD_TRACK];
		    my $units	= $line->[FIELD_UNITS];
		    my $price	= $line->[FIELD_PRICE];
            $price = $price / $units unless ($units == 0);
    
		    if ($units && defined $price && $track) {
		        my $sale = RPS::Import::SaleRec->new();
    
		        $sale->productType($prodtype);
		        $sale->formatType($format);
		        $sale->dateBegin($dateBegin);
		        $sale->dateEnd($dateEnd);
		        $sale->albumName($album);
		        $sale->trackName($track);
		        $sale->trackNum($tracknum);
		        $sale->units($units);
		        $sale->price($price);
		        $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 $q_info = shift;

    my ($begin, $end);

    if ($q_info =~ m/^Q0?([1234])\s(\d{4})$/) {
        my $qtr  = $1;
        my $year = $2;
        if ($qtr == 1) {
            $begin = $year."-01-01";
            $end   = $year."-03-".Days_in_Month($year, 3);
        } elsif ($qtr == 2) {
            $begin = $year."-04-01";
            $end   = $year."-06-".Days_in_Month($year, 6);
        } elsif ($qtr == 3) {
            $begin = $year."-07-01";
            $end   = $year."-09-".Days_in_Month($year, 9);
        } elsif ($qtr == 4) {
            $begin = $year."-10-01";
            $end   = $year."-12-".Days_in_Month($year, 12);
        }
    } else {
        return undef;
    }

    return ($begin, $end);
}


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