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