package RPS::Import::DRA;

use strict;

use Date::Calc qw(Days_in_Month);

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

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

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

# map the service, as it appears in the orchard file, to
# our internal service id
my %service_map = (
    'Apple Computer, Inc.'  => [ Client::Service::DSP_ITUNES,        'US' ],
    'Audio Lunchbox'        => [ Client::Service::DSP_AUDIOLUNCHBOX, 'US' ],
    'GrooveMobile'          => [ Client::Service::DSP_GROOVEMOBILE,  'US' ],
    'iTunes Australia'      => [ Client::Service::DSP_ITUNES,        'AU' ],
    'iTunes Canada'         => [ Client::Service::DSP_ITUNES,        'CA' ],
    'iTunes S.a.r.l.'       => [ Client::Service::DSP_ITUNES,        'EU' ],
    'Liquid Digital Media'  => [ Client::Service::DSP_LIQUIDDIGITAL, 'US' ],
    'Microsoft Corporation' => [ Client::Service::DSP_MSNMUSIC,      'US' ],
    'MusicNet'              => [ Client::Service::DSP_MEDIANET,      'US' ],
    'Napster UK'            => [ Client::Service::DSP_NAPSTER,       'GB' ],
    'Napster US'            => [ Client::Service::DSP_NAPSTER,       'US' ],
    'Real Networks'         => [ Client::Service::DSP_REAL,          'US' ],
    'Ruckus Network'        => [ Client::Service::DSP_RUCKUS,        'US' ],
);

my %format_map = (
    'Permanent Download'    => RPS::File::Sale::FORMAT_DOWNLOAD,
    'Subscription Play'     => RPS::File::Sale::FORMAT_STREAM,
    'OTA'                   => RPS::File::Sale::FORMAT_DOWNLOAD,
    'Subscription Download' => RPS::File::Sale::FORMAT_DOWNLOAD,
);

my %field_map = (
    1 => {
        vendor_id   => 0,
        artist      => 1,
        track       => 2,
        album       => 3,
        upc         => 4,
        date_col    => 6,
        date_row    => 1,
        format_row  => 11,
        service_row => 12,
        start_col   => 38,
    },
);

use base 'RPS::Import::Importer';

#public methods

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

    my $lines   = $args{lines};
    my $fileObj = $args{file};
    my $version = $fileObj->VersionNum;
    ##my $version = $args{version}; ## for cmd-line testing

    my $offsets = $field_map{$version};

    return undef unless ($lines);
    my ( $dateBegin, $dateEnd ) = $self->_getDates( $lines->[ $offsets->{'date_row'} ]->[ $offsets->{'date_col'} ] );

    unless ( $dateBegin && $dateEnd ) {
        $self->errstr( "couldn't get dates from " . $lines->[ $offsets->{'date_row'} ]->[ $offsets->{'date_col'} ] );
        return undef;
    }

    my @columns;
    my $format;
    for ( my $i = $offsets->{'start_col'} ; $lines->[ $offsets->{'service_row'} ]->[$i] ne "" ; $i += 2 ) {
        unless ( $lines->[ $offsets->{'format_row'} ]->[$i] eq "" ) {
            $format = $format_map{ $lines->[ $offsets->{'format_row'} ]->[$i] };
            unless ( defined $format ) {
                $self->errstr( "unknown format: " . $lines->[ $offsets->{'format_row'} ]->[$i] . " - $format" );
                return undef;
            }
        }
        $columns[$i] = [
            $format,    ## format
            $service_map{ $lines->[ $offsets->{'service_row'} ]->[$i] }->[0] || undef,    ## service
            $service_map{ $lines->[ $offsets->{'service_row'} ]->[$i] }->[1] || undef,    ## country
        ];
        unless ( defined $columns[$i]->[1] ) {
            $self->errstr( "unknown service: " . $lines->[ $offsets->{'service_row'} ]->[$i] );
            return undef;
        }
    }

    my $linenum = 0;
    foreach my $line (@$lines) {
        $linenum++;
        next unless ( $linenum > $offsets->{'service_row'} + 1 );

        my $ptype     = RPS::File::Sale::TYPE_TRACK;
        my $artist    = $line->[ $offsets->{'artist'} ];
        my $album     = $line->[ $offsets->{'album'} ];
        my $track     = $line->[ $offsets->{'track'} ];
        my $vendor_id = $line->[ $offsets->{'vendor_id'} ];
        my $upc       = Common::Util::normalize_upc( $line->[ $offsets->{'upc'} ] );

        for ( my $col = $offsets->{'start_col'} ; $lines->[ $offsets->{'service_row'} ]->[$col] ne "" ; $col += 2 ) {

            my $format  = $columns[$col]->[0];
            my $service = $columns[$col]->[1];
            my $country = $columns[$col]->[2];

            my $units = $line->[$col];
            my $price = $line->[ $col + 1 ];

            $price = ( $units != 0 ) ? ( $price / $units ) : 0;

            if ( $units && $track && $artist && $album && $service && $country && $format ) {
                my $sale = RPS::Import::SaleRec->new();

                $sale->serviceID($service);
                $sale->productType($ptype);
                $sale->formatType($format);
                $sale->dateBegin($dateBegin);
                $sale->dateEnd($dateEnd);
                $sale->serviceProductID($vendor_id);
                $sale->upc($upc);
                $sale->artistName($artist);
                $sale->albumName($album);
                $sale->trackName($track);
                $sale->units($units);
                $sale->price($price);
                $sale->lineNum($linenum);
                $sale->countryCode($country);

                ##$args{dumper}($sale); # for cmd-line testing
                $self->_insertSale( sale => $sale );
            }

            #else { print "skip: line $linenum , col $col f: $format , s: $service , c: $country\n" if ($units != 0); }
        }
    }
    return $linenum;
}

#
# Private methods
#

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

    my ( $dateBegin, $dateEnd );

    if ( $date =~ m/^(\d{1,2})\/(\d{4})$/ ) {
        my $dateBegin = sprintf( "%04d-%02d-%02d", $2, $1, 1 );
        my $dateEnd = sprintf( "%04d-%02d-%02d", $2, $1, Days_in_Month( $2, $1 ) );
        return ( $dateBegin, $dateEnd );
    }

    return undef;
}

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