#!/usr/bin/perl
use strict;

# -----------------------------------------
# input params:
#
# 	- client_id
# 	- service_id
#
# -----------------------------------------
# what it does:
#
#   - for every file with open status
# 	  - get unmatched sale records from db
#     - if product map record exists, map it
#     - otherwise, on to next record
#
# -----------------------------------------

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

# -----------------------------------------

unless ( -t STDIN ) {
    select STDERR if open( STDERR, ">>/app/shared/sale_import/automap.log" );
}

print "running with args '@ARGV'\n";
my $client_id  = $ARGV[0] or usage('no client id passed');
my $service_id = $ARGV[1] or 0;

my $cnt_map = 0;
my $summary = map_unmatched( $client_id, $service_id );

map {
    print "matched $summary->{$_} for file $_\n" if $summary->{$_};
    $cnt_map += $summary->{$_};
} keys %$summary;

print scalar( keys(%$summary) ) . " files analyzed\n";
print "$cnt_map total records mapped\n";

# -----------------------------------------

sub map_unmatched {
    my ( $client_id, $service_id ) = @_;
    my %summary = ();

    my $files = RPS::File::Files->new( client_id => $client_id );
    $files->GetByStatus( file_status => File::File::STATUS_OPEN );

    while ( my $fileObj = $files->GetNext() ) {
        next if ( $service_id and $fileObj->ServiceID() != $service_id );

        my $file_id    = $fileObj->FileID;
        my $service_id = $fileObj->ServiceID;
        $summary{$file_id} = 0;

        my $sales = File::Sales->new( client_id => $client_id );
        $sales->GetUnmatchedByFile( file_id => $file_id );

        while ( my $sale = $sales->GetNext() ) {
            my $data = {
                product_type       => $sale->ProductType,
                upc                => $sale->UPC,
                isrc               => $sale->ISRC,
                artist             => $sale->ArtistName,
                album              => $sale->AlbumName,
                track              => $sale->TrackName,
                track_num          => $sale->TrackNum,
                service_id         => $service_id,
                service_product_id => $sale->ServiceProductID,
            };

            my $match = RPS::Sale::Match->new( client_id => $client_id );
            my $result = $match->FindBestMatch( data => $data, map_only => 1 );

            if (
                $result
                && (   $result->ImportStatus == File::Sale::STATUS_MAPPED
                    || $result->ImportStatus == File::Sale::STATUS_AUTO_MAPPED
                    || $result->ImportStatus == File::Sale::STATUS_BATCH_MAPPED )
              ) {
                $sale->ImportStatus( $result->ImportStatus );
                $sale->ProductID( $result->ProductIDs->[0] );
                $sale->MapID( $result->MapID );
                $sale->Save();

                $summary{$file_id}++;
            }
        }

        # oh what the heck, go ahead and make sure the metrics are accurate
        $fileObj->UpdateSummary() if $summary{$file_id};

    }
    return \%summary;
}

sub usage {
    my $err = shift;

    print "ERROR: $err\n";
    print "Usage: map_unmatched.pl CLIENT_ID SERVICE_ID\n";

    exit();
}
