package RPS::Import::Barden;

use strict;

use Date::Calc qw(Days_in_Month Decode_Month);

use lib '/app/tools/common/lib';

#use Common::Util;
use Common::Util qw(normalize_date normalize_isrc);
use Common::Consts qw(%COUNTRY_CODE);

use lib '/app/tools/data_classes/lib';
use Client::Service;

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

my %field_map = (
    1 => {
        begin_date_tag_col => 0,
        begin_date_col     => 1,
        end_date_col       => 3,
        service_id         => 0,
        artist             => 1,
        track              => 2,
        isrc               => 3,
        units              => 4,
        revenue            => 5,
    },
);

#public methods

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

    my $lines    = $args{lines};
    my $version  = $args{file}->VersionNum();
    my $fileName = $args{file}->OrigFileName();
    my @sheets   = @{ $args{sheets} };

    return undef unless ($lines);

    my $gross_total = 0;

    my $linenum  = 0;
    my $sheetnum = 0;

    my $offsets = $field_map{$version};
    my %errors  = ();

    #$canadian_dollar = 1 if($fileName =~ /^CAD_/);

    my ( $dateBegin, $dateEnd );

    my $type = 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 $sheet (@sheets) {
        $sheetnum++;
        $linenum = 1;

        foreach my $line (@$sheet) {
            my $service_product_id = $line->[ $offsets->{service_id} ];
            my $artist             = $line->[ $offsets->{artist} ];
            my $track              = $line->[ $offsets->{track} ];
            my $isrc               = normalize_isrc( $line->[ $offsets->{isrc} ] );
            my $units              = $line->[ $offsets->{units} ];
            my $revenue            = $line->[ $offsets->{revenue} ];

            my $f_date_begin;
            my $f_date_end;

            if ( $line->[ $offsets->{begin_date_tag_col} ] eq "Begin Date" ) {
                $f_date_begin = $line->[ $offsets->{begin_date_col} ];
                $f_date_end   = $line->[ $offsets->{end_date_col} ];
                ( $dateBegin, $dateEnd ) = $self->_getDates( $f_date_begin, $f_date_end );

                unless ( $dateBegin && $dateEnd ) {
                    $self->errstr("couldn't get dates from $f_date_begin, $f_date_end sheet: $sheetnum at row $linenum ");
                    print STDERR "$fileName\n";
                    return undef;
                }
            }

            if (   $service_product_id
                && $service_product_id =~ /\d+/
                && $artist
                && $track
                && $units
                && $revenue ) {

                my $price = ( $revenue / $units ) if ( $units > 0 );

                my $sale = RPS::Import::SaleRec->new();

                $sale->serviceProductID($service_product_id);
                $sale->productType($type);
                $sale->formatType($format);
                $sale->mediaType($mediaType);
                $sale->dateBegin($dateBegin);
                $sale->dateEnd($dateEnd);
                $sale->isrc($isrc) if ($isrc);
                $sale->artistName($artist);
                $sale->trackName($track);
                $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 $date_begin = shift;
    my $date_end   = shift;

    $date_begin =~ /(\d+)\/(\d+)\/(\d+)/;

    my $year = $3;

    if ( $year < 2000 ) {
        $year += 2000;
    }

    my ( $begin_month, $begin_day, $begin_year ) = ( $1, $2, $year );

    #print STDERR "Passed date begin: $date_begin date end: $date_end\n";

    $date_end =~ /(\d+)\/(\d+)\/(\d+)/;

    $year = $3;

    if ( $year < 2000 ) {
        $year += 2000;
    }

    my ( $end_month, $end_day, $end_year ) = ( $1, $2, $year );

    #print STDERR "End month $end_month end day $end_day ".
    "end year $end_year begin month $begin_month begin day $begin_day begin year $begin_year\n";

    if ( !( $end_month && $end_day && $end_year && $begin_month && $begin_day && $begin_year ) ) {
        return undef;
    }

    my $dateBegin = sprintf( "%04d-%02d-%02d", $begin_year, $begin_month, $begin_day );
    my $dateEnd   = sprintf( "%04d-%02d-%02d", $end_year,   $end_month,   $end_day );

    return ( $dateBegin, $dateEnd );

}

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