#!/usr/bin/perl
use strict;

# -----------------------------------------
# input params:
#
# 	- s service_id
# 	- c (check only, no update)
#
# -----------------------------------------
# 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;

use constant CLIENT_ID  => 31;
use constant CLIENT_DIR => 'sanctuary_records_group';
use constant LOG        => 'automap_unmatched.log';

use Getopt::Std;

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

unless ( -t STDIN ) {
    my $log = join( '/', '/app/shared/sale_import', CLIENT_DIR, LOG );
    select STDERR if open( STDERR, ">>$log" );
}

print "running with args '@ARGV'\n";

my %opt;
getopts( 's:c', \%opt );

my $NOUPDATE = $opt{c} ? 1 : 0;
my $service_id = $opt{s} 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 ", $NOUPDATE ? "mappable\n" : "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 );

            next
              unless (
                $result
                && (   $result->ImportStatus == File::Sale::STATUS_MAPPED()
                    || $result->ImportStatus == File::Sale::STATUS_AUTO_MAPPED()
                    || $result->ImportStatus == File::Sale::STATUS_BATCH_MAPPED() )
              );

            if ( !$NOUPDATE ) {
                $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 ( !$NOUPDATE && $summary{$file_id} );

    }
    return \%summary;
}

