package RPS::Import::MusicChoice;

use strict;


use Date::Calc qw(Days_in_Month Decode_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';

use constant SUMMARY_PERIOD => 2;
use constant SUMMARY_UNITS  => 3;
use constant SUMMARY_PRICE  => 7;

use constant FIELD_TV_LABEL  => 3;
use constant FIELD_TV_TRACK  => 5;
use constant FIELD_TV_ARTIST => 11;
use constant FIELD_TV_UNITS  => 12;

use constant FIELD_FINAL_LABEL => 0;
use constant FIELD_FINAL_TRACK => 1;
use constant FIELD_FINAL_UNITS => 2;

#public methods

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

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

    my $linenum;

    my $prodtype = RPS::File::Sale::TYPE_TRACK;
    my $format;
    my $mediaType;

    if( $self->is_wmg() )
    {
        $format = RPS::File::Sale::FORMAT_STREAM; # was FORMAT_VIDEOSTREAM (FB1324)
        $mediaType = RPS::DB::Item::MediaType::kMediaTypeVideo;
    }
    else
    {
        $format = RPS::File::Sale::FORMAT_STREAM;
        $mediaType = RPS::DB::Item::MediaType::kMediaTypeAudio;
    }

    my $period_name  = "";
    my $period_month = "";
    my $dateBegin;
    my $dateEnd;
    
    my $price = undef;

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

        ## Summary Sheet
        if ($sheet_i == 0) {
            if ($sheet_name ne "Summary") {
                $self->errstr("first sheet is not summary");
                return undef;
            }
            my $period_col = -1;
            my $row = $sheet->[SUMMARY_PERIOD];
            foreach my $cell (@$row) {
                last if ($cell eq "Total");
                $period_name = $cell;
                $period_col++;
            }

            if ($sheet->[SUMMARY_UNITS]->[$period_col] != 0) {
                $price = ($sheet->[SUMMARY_PRICE]->[$period_col] / $sheet->[SUMMARY_UNITS]->[$period_col]);
            } else {
                $price = 0;
            }

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

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

            $period_name =~ m/^(.*)\s+\d{4}$/;
            $period_month = $1;

            next;
        }

        ## TV400 Sheet
        if ($sheet_i == (scalar @$sheets) - 2) {
            if ($sheet_name ne "$period_month TV400") {
                $self->errstr("TV400 sheet has wrong month name");
                return undef;
            }
            $linenum = 1;
            my $label = "";
            foreach my $line(@$sheet) {
                if ($line->[FIELD_TV_LABEL] ne "") {
                    $label = $line->[FIELD_TV_LABEL];
                    next;
                }
                my $track  = $line->[FIELD_TV_TRACK];
                my $artist = $line->[FIELD_TV_ARTIST];
                my ($units) = $line->[FIELD_TV_UNITS] =~ m/^(\d+)$/;;
                if ($label && $track && $units) {
                    my $sale = RPS::Import::SaleRec->new();
                    $sale->productType($prodtype);
                    $sale->formatType($format);
                    $sale->dateBegin($dateBegin);
                    $sale->dateEnd($dateEnd);
                    $sale->trackName($track);
                    $sale->artistName($artist);
                    $sale->labelName($label);
                    $sale->price($price);
                    $sale->units($units);
                    $sale->countryCode('US');
                    $sale->lineNum($linenum);
    
                    ##$args{dumper}($sale);  ## for cmd-line testing
                    $self->_insertSale(sale => $sale);
                }
                $linenum++;
            }
            next;
        }

        ## Final Sheet
        if ($sheet_i == (scalar @$sheets) - 1) {
            if ($sheet_name ne $period_name) {
                $self->errstr("final sheet has wrong month name");
                return undef;
            }
            $linenum = 1;
            my $prev_label = "";
            foreach my $line(@$sheet) {
                my $label = $line->[FIELD_FINAL_LABEL];
                my $track = $line->[FIELD_FINAL_TRACK];
                my ($units) = $line->[FIELD_FINAL_UNITS] =~ m/^(\d+)$/;;
                $label = $prev_label if ($label eq "");
                if ($label && $track && $units) {
                    my $sale = RPS::Import::SaleRec->new();
                    $sale->productType($prodtype);
                    $sale->formatType($format);
                    $sale->mediaType($mediaType);
                    $sale->dateBegin($dateBegin);
                    $sale->dateEnd($dateEnd);
                    $sale->trackName($track);
                    $sale->labelName($label);
                    $sale->price($price);
                    $sale->units($units);
                    $sale->countryCode('US');
                    $sale->lineNum($linenum);
    
                    ##$args{dumper}($sale);  ## for cmd-line testing
                    $self->_insertSale(sale => $sale);
                }
                $prev_label = $label;
                $linenum++;
            }
            next;
        }

    }

	return $linenum;
}

#
# Private methods
#


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

    $date =~ m/^(\w+)\s+(\d{4})$/;
    my $month = Decode_Month($1);
    my $year  = $2;

    my $dateBegin = sprintf("%04d-%02d-%02d", $year, $month, 1);
    my $dateEnd   = sprintf("%04d-%02d-%02d", $year, $month, Days_in_Month($year, $month));

	return ($dateBegin, $dateEnd);
}

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