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.
###
