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

            # RSD-11462
            if ( $serviceID == Client::Service::DSP_SOUNDEXCHANGE ) {
                $format = RPS::File::Sale::FORMAT_NON_EPHEMERAL;
            }

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