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