package RPS::Import::MusicChoiceSimple;

## not really "simple," but it has less tabs...

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

## doesn't correspond to version nos.
my %field_map = (
    1 => {
        'label' => 1,
        'track' => 2,
        'units' => 3,
    },
    2 => {
        'label'  => 3,
        'track'  => 5,
        'artist' => 11,
        'units'  => 12,
    },
    3 => {
        'label' => 0,
        'track' => 1,
        'units' => 2,
    },
    4 => {
        'label'  => 0,
        'artist' => 1,
        'track'  => 2,
        'units'  => 3,
    },
    5 => {
        'label'  => 1,
        'artist' => 2,
        'track'  => 3,
        'units'  => 4,
    },
    6 => {
        'label'  => 1,
        'track'  => 2,
        'artist' => 3,
        'units'  => 4,
    },
    7 => {
        'label'  => 0,
        'track'  => 1,
        'artist' => 2,
        'units'  => 3,
    },
    8 => {
        'track' => 1,
        'units' => 2,
        'label' => 3,
    },
);

my $SHEETNUM;

#public methods

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

    $SHEETNUM = 0;
    my $retval   = undef;
    my $sheets   = $args{sheets};
    my $fileObj  = $args{file};
    my $fileName = $fileObj->OrigFileName;
    my $version  = $fileObj->VersionNum;

    # for cmd-line testing
    #my $fileName = $args{OrigFileName};
    #my $version = $args{version};

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

    unless ( $dateBegin && $dateEnd ) {
        $self->errstr("couldn't get dates");
        print STDERR "filename: $fileName\n";
        return undef;
    }
    my $price = undef;

    if ( $version == 9 ) {
        my $sheet_format = $self->_getSheetFormat( $sheets->[2] );
        unless ($sheet_format) {
            $self->errstr("unrecognized sheet format");
            return undef;
        }

        $self->_processSheet(
            sheet     => $sheets->[2],
            format    => $sheet_format,
            dateBegin => $dateBegin,
            dateEnd   => $dateEnd,
        );
    } elsif ( $version == 10 ) {
        my $sheetNum = 0;
        foreach my $sheet (@$sheets) {
            my $sheet_format = $self->_getSheetFormat($sheet);
            unless ($sheet_format) {
                print STDERR "unknown sheet format ($sheetNum)\n";
                $sheetNum++;
                next;
            }

            $self->_processSheet(
                sheet     => $sheet,
                format    => $sheet_format,
                dateBegin => $dateBegin,
                dateEnd   => $dateEnd,
            );
            $sheetNum++;
        }
    } else {
        foreach my $sheet (@$sheets) {
            my $sheet_format = $self->_getSheetFormat($sheet);
            unless ($sheet_format) {
                $self->errstr("unrecognized sheet format");
                return undef;
            }
            $self->_processSheet(
                sheet     => $sheet,
                format    => $sheet_format,
                dateBegin => $dateBegin,
                dateEnd   => $dateEnd,
            );
        }
    }
    return 1;
}

sub _processSheet {
    my $self         = shift;
    my %args         = @_;
    my $sheet_format = $args{format};

    my $offsets  = $field_map{$sheet_format};
    my $label    = "";
    my $artist   = "";
    my $linenum  = 1;
    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;
    }

    foreach my $line ( @{ $args{sheet} } ) {
        if ( $sheet_format == 7 && $line->[0] eq "The Fan - August" ) {
            $sheet_format = 1;
            $offsets      = $field_map{$sheet_format};
        }

        $label = $line->[ $offsets->{label} ] if ( $line->[ $offsets->{label} ] ne "" );
        if ( $offsets->{artist} ) {
            $artist = $line->[ $offsets->{artist} ] if ( $line->[ $offsets->{artist} ] ne "" );
        } else {
            $artist = "";
        }
        my $track = $line->[ $offsets->{track} ];
        my ($units) = $line->[ $offsets->{units} ] =~ m/^(-?\d+)$/;

        if ( $sheet_format == 6 || $sheet_format == 7 ) {
            if ( $line->[ $offsets->{artist} ] eq "" ) {
                $linenum++;
                next;
            }
            $track =~ s/^.+\:\s*// if ( $sheet_format == 6 );
        }

        if ( $sheet_format == 1 || $sheet_format == 8 ) {
            if ( $track =~ m/^(.+)\s*\:\s*(.+)$/ ) {
                $artist = $1;
                $track  = $2;
            } elsif ( $track =~ m/^(.+) - (.+)$/ ) {
                $artist = $1;
                $track  = $2;
            }
        }

        if ( $label && $track && $units ) {
            my $sale = RPS::Import::SaleRec->new();
            $sale->productType($prodtype);
            $sale->formatType($format);
            $sale->mediaType($mediaType);
            $sale->dateBegin( $args{dateBegin} );
            $sale->dateEnd( $args{dateEnd} );
            $sale->trackName($track);
            $sale->artistName($artist);
            $sale->labelName($label);
            $sale->units($units);
            $sale->lineNum($linenum);

            ##$args{dumper}($sale);  ## for cmd-line testing
            $self->_insertSale( sale => $sale );
        }    #else { print STDERR "skipping l: $label t: $track u: $units ($SHEETNUM,$linenum)\n"; }

        $linenum++;
    }
    $SHEETNUM++;
}

#
# Private methods
#

sub _getSheetFormat {
    my $self  = shift;
    my $sheet = shift;

    if ( $sheet->[2]->[0] eq "Label 1" && $sheet->[2]->[1] eq "Label 2" ) {
        return 1;
    } elsif ( $sheet->[2]->[0] eq "Parent Label" && $sheet->[2]->[1] eq "Label Name" ) {
        return 5;
    } elsif ( $sheet->[2]->[0] eq "PARENT LABEL" && $sheet->[2]->[3] eq "Total" ) {
        return 1;
    } elsif ( $sheet->[3]->[0] eq "PARENT LABEL" && $sheet->[3]->[3] eq "Total" ) {
        return 1;
    } elsif ( $sheet->[2]->[0] eq "PARENT LABEL" && $sheet->[2]->[3] eq "Artist" ) {
        return 6;
    } elsif ( $sheet->[2]->[0] eq "Sum of Orders" ) {
        if ( $sheet->[3]->[0] eq "Source" && $sheet->[3]->[1] eq "Title" ) {
            return 3;
        } elsif ( $sheet->[3]->[0] eq "Source" && $sheet->[3]->[1] eq "Name" ) {
            return 7;
        } elsif ( $sheet->[3]->[0] eq "Source" && $sheet->[3]->[1] eq "Artists" ) {
            return 4;
        }
    } elsif ( $sheet->[0]->[0] eq "Sum of Orders" ) {
        if ( $sheet->[1]->[0] eq "Source" && $sheet->[1]->[1] eq "Artists" ) {
            return 4;
        } elsif ( uc( $sheet->[1][0] ) eq "SOURCE" && uc( $sheet->[1][1] ) eq "LABEL_NAME" ) {
            return 1;
        }
    } elsif ( $sheet->[2]->[0] eq "" ) {
        if ( $sheet->[0]->[4] eq "TV400 - Play Count By Label" ) {
            return 2;
        }
    } elsif ( uc $sheet->[1][0] eq "USAGE_FEED_SOURCE_CODE" ) {
        return 1;
    } elsif ( $sheet->[0][1] eq 'TV200_TITLE' ) {
        return 8;
    }

    return 0;
}

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

    my ( $month, $year );
    if ( $date =~ m/MusicChoice (\w+)\s+(\d{4})/ ) {
        $month = Decode_Month($1);
        $year  = $2;
    } elsif ( $date =~ m/\w+\D+(\d+)\D+(\d+)\D/ ) {
        $year  = $1;
        $month = $2;
    }

    return undef unless ( $month && $year );

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