package RPS::Import::Orchard;

use strict;

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

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

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

my %field_map = (
    1 => {
        service         => 0,
        artist          => 1,
        album           => 2,
        track           => 4,
        isrc            => 5,
        track_num       => 7,
        track_units     => 10,
        track_price     => 11,
        album_units     => 12,
        album_price     => 13,
        stream_units    => 14,
        stream_price    => 15,
        ringtone_units  => 16,
        ringtone_price  => 17,
        tethered_units  => 18,
        tethered_price  => 19,
    },
    2 => {
        service         => 0,
        artist          => 1,
        album           => 2,
        upc             => 3,
        upc_alt         => 4,
        vendor_id       => 5,
        track           => 6,
        isrc            => 7,
        track_num       => 9,
        track_units     => 12,
        track_price     => 13,
        album_units     => 14,
        album_price     => 15,
        stream_units    => 16,
        stream_price    => 17,
        ringtone_units  => 18,
        ringtone_price  => 19,
        ringback_units  => 20,
        ringback_price  => 21,
        tethered_units  => 22,
        tethered_price  => 23,
    },
);

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

	my $lines = $args{lines};
    return undef unless $lines;
    my $version = $self->_version;
	my $fileObj = $args{file};
	my $fileName = $fileObj->OrigFileName;
    # for cmd-line testing
    #my $fileName = $args{OrigFileName};

    my $offsets = $field_map{$version};

    my ($dateBegin, $dateEnd) = $self->_getDates($fileName);

    unless ($dateBegin && $dateEnd)
    {
        $self->errstr("couldn't get dates");
        print STDERR "filename: $fileName\n";
        return undef;
    }

    my %errors = ();
    my $linenum;
    for ($linenum=1; defined $lines->[$linenum]; $linenum++)
    {
        my $line = $lines->[$linenum];
        my ($serviceID, $countryCode) =
            $self->_parseServiceCountry($line->[$offsets->{'service'}], \%errors);

        my ($upc, $vendor_id);
        if ($version == 2)
        {
            $upc = $line->[$offsets->{'upc'}] || $line->[$offsets->{'upc_alt'}];
            $vendor_id = $line->[$offsets->{'vendor_id'}];
        }

        my $artist = $line->[$offsets->{'artist'}];
        my $album = $line->[$offsets->{'album'}];
        my $track = $line->[$offsets->{'track'}];
        my $isrc = $line->[$offsets->{'isrc'}];
        my $track_num = $line->[$offsets->{'track_num'}];

        my $track_units = $self->numeric($line->[$offsets->{'track_units'}]);
        my $track_price = $self->numeric($line->[$offsets->{'track_price'}]);

        my $album_units = $self->numeric($line->[$offsets->{'album_units'}]);
        my $album_price = $self->numeric($line->[$offsets->{'album_price'}]);

        my $stream_units = $self->numeric($line->[$offsets->{'stream_units'}]);
        my $stream_price = $self->numeric($line->[$offsets->{'stream_price'}]);

        my $ringtone_units = $self->numeric($line->[$offsets->{'ringtone_units'}]);
        my $ringtone_price = $self->numeric($line->[$offsets->{'ringtone_price'}]);

        my $ringback_units = $self->numeric($line->[$offsets->{'ringback_units'}]);
        my $ringback_price = $self->numeric($line->[$offsets->{'ringback_price'}]);

        my $tethered_units = $self->numeric($line->[$offsets->{'tethered_units'}]);
        my $tethered_price = $self->numeric($line->[$offsets->{'tethered_price'}]);

        my @sale_types = ();

        # each line contains sales data for many different formats.
        # collect them all here and enter as many rows into the sale
        # table as necessary.
        if ($track_units > 0)
        {
            my $href = {};
            $href->{'type'} = RPS::File::Sale::TYPE_TRACK;
            $href->{'format'} = RPS::File::Sale::FORMAT_DOWNLOAD;
            $href->{'units'} = $track_units;
            $href->{'price'} = $track_price / $track_units;

            push @sale_types, $href;
        }

        if ($album_units > 0)
        {
            my $href = {};
            $href->{'type'} = RPS::File::Sale::TYPE_ALBUM;
            $href->{'format'} = RPS::File::Sale::FORMAT_DOWNLOAD;
            $href->{'units'} = $album_units;
            $href->{'price'} = $album_price / $album_units;

            push @sale_types, $href;
        }

        if ($stream_units > 0)
        {
            my $href = {};
            $href->{'type'} = RPS::File::Sale::TYPE_TRACK;
            $href->{'format'} = RPS::File::Sale::FORMAT_STREAM;
            $href->{'units'} = $stream_units;
            $href->{'price'} = $stream_price / $stream_units;

            push @sale_types, $href;
        }

        if ($ringtone_units > 0)
        {
            my $href = {};
            $href->{'type'} = RPS::File::Sale::TYPE_TRACK;
            $href->{'format'} = RPS::File::Sale::FORMAT_RINGTONE;
            $href->{'units'} = $ringtone_units;
            $href->{'price'} = $ringtone_price / $ringtone_units;

            push @sale_types, $href;
        }

        if ($ringback_units > 0)
        {
            my $href = {};
            $href->{'type'} = RPS::File::Sale::TYPE_TRACK;
            $href->{'format'} = RPS::File::Sale::FORMAT_RINGBACK;
            $href->{'units'} = $ringback_units;
            $href->{'price'} = $ringback_price / $ringback_units;

            push @sale_types, $href;
        }

        if ($tethered_units > 0)
        {
            my $href = {};
            $href->{'type'} = RPS::File::Sale::TYPE_TRACK;
            $href->{'format'} = RPS::File::Sale::FORMAT_TETHERED;
            $href->{'units'} = $tethered_units;
            $href->{'price'} = $tethered_price / $tethered_units;

            push @sale_types, $href;
        }

        foreach my $sale_href (@sale_types)
        {
            # variable fields based on the type of the sale
            my $type = $sale_href->{'type'};
            my $format = $sale_href->{'format'};
            my $units = $sale_href->{'units'};
            my $price = $sale_href->{'price'};

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

                $sale->serviceID($serviceID);
                $sale->productType($type);
                $sale->formatType($format);
                $sale->dateBegin($dateBegin);
                $sale->dateEnd($dateEnd);
                $sale->serviceProductID($vendor_id);
                $sale->upc($upc);
                $sale->isrc($isrc);
                $sale->artistName($artist);
                $sale->albumName($album);
                $sale->trackName($track);
                $sale->trackNum($track_num);
                $sale->units($units);
                $sale->price($price);
                $sale->lineNum($linenum);
                $sale->countryCode($countryCode);

                #$args{dumper}($sale); # for cmd-line testing
                $self->_insertSale(sale => $sale);
            }
            #else { print "skip:$units $track ($artist or $album) and '$countryCode' and $serviceID\n"; }
        }
    }

    return $linenum;
}

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