package RPS::Import::YouTube2;

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 = (
    7 => {
        header_col         => 0,
        date_col           => 1,
        service_product_id => 1,
        track_ii           => 2,
        units_i            => 6,
        units_ii           => 8,
        units_iii          => 10,
        price              => 13,
        isrc               => 17,
        upc                => 19,
        artist             => 20,
        track_i            => 21,
        album              => 22,
        label              => 23
    },
);

#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} };

    my $track_url_start = "http://youtube.com/watch?v=";

    return undef unless ($lines);

    my $linenum = 1;

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

    my ( $dateBegin, $dateEnd );

    my $type   = RPS::File::Sale::TYPE_TRACK;
    my $format = RPS::File::Sale::FORMAT_STREAM;    # was FORMAT_VIDEOSTREAM (FB1324)

    my $header;

    foreach my $line (@$lines) {
        my $service_product_id = $line->[ $offsets->{service_product_id} ];
        my $artist             = $line->[ $offsets->{artist} ];
        my $track              = $line->[ $offsets->{track_i} ];

        if ( !$track ) {
            $track = $line->[ $offsets->{track_ii} ];
        }

        my $album = $line->[ $offsets->{album} ];
        my $isrc  = normalize_isrc( $line->[ $offsets->{isrc} ] );
        my $units = $line->[ $offsets->{units_i} ] + $line->[ $offsets->{units_ii} ] + $line->[ $offsets->{units_iii} ];

        my $price = $line->[ $offsets->{price} ];
        my $label = $line->[ $offsets->{label} ];
        my $upc   = $line->[ $offsets->{upc} ];

        $label =~ s/\(www.*\)//g;

        my $f_date_begin;
        my $f_date_end;

        if ( !$dateBegin
            && ( $line->[ $offsets->{date_col} ] =~ /\d{4}\D\d{2}\D\d{2}/ ) ) {
            $dateBegin = $line->[ $offsets->{date_col} ];
        } elsif ( !$dateEnd
            && ( $line->[ $offsets->{date_col} ] =~ /\d{4}\D\d{2}\D\d{2}/ ) ) {
            $dateEnd = $line->[ $offsets->{date_col} ];
        }

        if ( $line->[ $offsets->{header_col} ] =~ /#(.*)/ ) {
            $header = $line->[ $offsets->{header_col} ];
            $linenum++;
            next;
        }

        if (
               $service_product_id
            && $units =~ /\d+/
            && $price =~ /\d+/
            && (   $header =~ /commercial-share per video_id table/
                || $header =~ /ugc-share per video_id table/ )
          ) {
            $price = ( $price / $units ) if ( $units > 0 );

            my $free = $price == 0 ? 1 : 0;

            if ( !$track ) {
                $track = $track_url_start . $service_product_id;
            }

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

            $sale->serviceProductID($service_product_id);
            $sale->mediaType(2);
            $sale->productType($type);
            $sale->formatType($format);
            $sale->dateBegin($dateBegin);
            $sale->dateEnd($dateEnd);
            $sale->isrc($isrc) if ($isrc);
            $sale->upc($upc)   if ($upc);
            $sale->artistName($artist);
            $sale->trackName($track);
            $sale->albumName($album);
            $sale->labelName($label);
            $sale->units($units);
            $sale->price($price);
            $sale->free($free);
            $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.
###
