package RPS::Import::MusicAirport;

use strict;

use Data::Dumper;
use Date::Calc qw(Days_in_Month);

use lib '/app/tools/common/lib';
use Common::Util;

use lib '/app/tools/data_classes/lib';

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

my %field_map = (
    1 => {
        svc_prod_id => 0,
        isrc        => 2,
        track       => 3,
        artist      => 11,
    },
    2 => {
        svc_prod_id => 0,
        isrc        => 1,
        track       => 3,
        artist      => 11,
    },

    # v3 is similar to v1 but we'll keep it separate in case we start to care about
    # some of the other fields that _are_ different
    3 => {
        svc_prod_id => 0,
        isrc        => 2,
        track       => 3,
        artist      => 11,
    },

    # similar to v3
    4 => {
        svc_prod_id => 0,
        isrc        => 2,
        track       => 3,
        artist      => 11,
    },
);

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

    my $fileObj  = $args{file};
    my $fileName = $fileObj->OrigFileName;
    my $version  = $fileObj->VersionNum;

    #my $fileName = $args{OrigFileName};
    #my $version = $args{version};

    my $offsets = $field_map{$version};
    my $lines   = $args{lines};
    return 0 unless ($lines);

    my ( $dateBegin, $dateEnd, $distributors ) = $self->_getDatesAndDistributors($lines);
    unless ( $dateBegin && $dateEnd ) {
        $self->errstr("couldn't get dates");
        return undef;
    }
    unless ( ref $distributors eq 'ARRAY' and scalar @$distributors > 0 ) {
        $self->errstr("couldn't get services");
        return undef;
    }

    my $prodType = RPS::File::Sale::TYPE_TRACK;
    my $format   = RPS::File::Sale::FORMAT_DOWNLOAD;
    my $linenum  = 1;
    foreach my $line (@$lines) {
        my $svcProd = $line->[ $offsets->{svc_prod_id} ];
        my $isrc    = Common::Util::normalize_isrc( $line->[ $offsets->{isrc} ] );
        my $track   = $line->[ $offsets->{track} ];
        my $artist  = $line->[ $offsets->{artist} ];

        if ( $track && $artist && $svcProd =~ m/\d+/ ) {
            my $sale = RPS::Import::SaleRec->new();

            $sale->productType($prodType);
            $sale->formatType($format);
            $sale->dateBegin($dateBegin);
            $sale->dateEnd($dateEnd);
            $sale->serviceProductID($svcProd);
            $sale->isrc($isrc);
            $sale->artistName($artist);
            $sale->trackName($track);
            $sale->lineNum($linenum);
            $sale->currencyCode('JPY');
            $sale->countryCode('US');

            foreach my $dist (@$distributors) {
                my ($units) = $line->[ $dist->{offset} ] =~ m/^(\d+)$/;
                my ($price) = $line->[ $dist->{offset} + 1 ] =~ m/^(\d+)$/;

                if ( $units > 0 && $price > 0 ) {
                    $price /= $units;
                    $sale->serviceID( $dist->{serviceID} );
                    $sale->units($units);
                    $sale->price($price);

                    #$args{dumper}($sale);  ## for cmd-line testing
                    $self->_insertSale( sale => $sale );
                }
            }
        }    #else { print STDERR "skip $linenum\n"; }
        $linenum++;
    }
    return $linenum;
}

#
# Private methods
#

sub _getDatesAndDistributors {
    my $self  = shift;
    my $lines = shift;

    my ( $monthBegin, $year );

    # 'Period:' is declared somewhere within the first 15 lines
    my $i = 0;
  DATE:
    for ( $i = 0 ; $i < 15 ; $i++ ) {
        for ( my $j = 0 ; defined $lines->[$i][$j] ; $j++ ) {
            if ( lc $lines->[$i][$j] eq 'period:' ) {
                ( $monthBegin, $year ) = split /\s*\/\s*/, $lines->[$i][ $j + 1 ];
                last DATE;
            }
        }
    }
    return undef unless $year;

    my $monthEnd;
    if ( $monthBegin =~ m#(\d+)\D+(\d+)# )    # month range
    {
        ( $monthBegin, $monthEnd ) = ( $1, $2 );
    } else                                    # single month
    {
        $monthEnd = $monthBegin;
    }

    my @dist;

    # continue where $i left off
  DIST:
    for ( ; $i < 25 ; $i++ ) {
        if ( lc $lines->[$i][0] eq 'id' ) {
            for ( my $j = 1 ; defined $lines->[$i][$j] ; $j++ ) {
                if ( lc $lines->[$i][$j] eq 'royalty' ) {
                    $j++;
                    $j++ unless ( length $lines->[$i][$j] );    # Royalty may occupy 2 cols
                    while ( defined $lines->[$i][$j] ) {
                        last if ( lc $lines->[$i][$j] eq 'total royalty' );
                        if ( my $serviceID = $self->getServiceID( $lines->[$i][$j] ) ) {
                            push @dist,
                              {
                                serviceID => $serviceID,
                                offset    => $j,
                              };
                        } else {
                            $self->warning();
                            print STDERR "can't map service: $lines->[$i][$j]\n";
                        }
                        $j += 2;
                    }
                    last DIST;
                }
            }
        }
    }

    return ( Common::Util::normalize_date( join( '-', $year, $monthBegin, 1 ) ),
        Common::Util::normalize_date( join( '-', $year, $monthEnd, Days_in_Month( $year, $monthEnd ) ) ), \@dist, );
}

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