package RPS::Sale::Match::SRGI;

use strict;
use warnings;

use base 'RPS::Sale::Match';

sub new
{
    my ($self, $parent) = @_;
    return undef unless (ref($parent) eq 'HASH');

    return bless $parent;
}

sub FindBestMatch {
	my $self = shift;
    my %in = @_;

    my $result = $self->SUPER::FindBestMatch(@_);

    if ($result && $in{skip_rec} && $result->NumProducts > 1 && $in{data}{product_type} eq 'T')
    {
        if (my $product_id = $self->_tiebreak(\@{ $result->ProductIDs() }, $in{data}))
        {
            RPS::Sale::Match::DEBUG && print STDERR "srgi match $in{data}->{track} $in{data}->{isrc} to $product_id\n";

            $result = new RPS::Sale::Match::Result(
                products => [$product_id],
                num_products => 1,
                import_status => RPS::Sale::Match::STATUS_MATCH,
                map_id => undef,
                rec_products => undef,
                search_products => [],
                detail => $result->Detail,
            );
        }
    }

	if (defined $result) {
		return $result;
	}
	else {
		$self->{errstr} = "Could not return results!";
		return undef;
	}
}

sub _tiebreak
{
    my ($self, $products, $record) = @_;

    return unless (
        ($record->{artist} && $record->{track} && $record->{album}) ||
        ($record->{artist} && $record->{track} && $record->{isrc} && !$record->{upc} && !$record->{album})
    );

    my $product_id_list = join(',',@$products);
    my $sql = qq|
SELECT t.title as track_name, t.album_id, p.product_id, p.release_date, a.title as album_name, a.vendor_id, r.name as artist_name, m.isrc
FROM track t, product p, album a, artist r, master m
WHERE t.track_id=p.asset_id
  AND p.product_type_id=4
  AND t.album_id=a.album_id
  AND t.artist_id=r.artist_id
  AND t.master_id=m.master_id
  AND p.product_id IN ($product_id_list) 
ORDER BY vendor_id desc, release_date
|;

    my $sth = $self->dbh()->prepare($sql);
    $sth->execute();

    my $match_ok = 1;
    my %albums_seen = ();
    my $product_id = ();

    if ($record->{album})
    {
        while (my $row = $sth->fetchrow_hashref)
        {
            if ($albums_seen{$row->{album_id}} or
                lc($record->{artist}) ne lc($row->{artist_name}) or
                lc($record->{album}) ne lc($row->{album_name}) or
                lc($record->{track}) ne lc($row->{track_name}))
            {
                $match_ok = 0;
                last;
            }

            $albums_seen{$row->{album_id}} = 1;
            $product_id ||= $row->{product_id};
        }
    }
    else
    {
        while (my $row = $sth->fetchrow_hashref)
        {
            if ($albums_seen{$row->{album_id}} or
                lc($row->{artist_name}) ne lc($record->{artist}) or
                $row->{isrc} ne $record->{isrc} or
                lc($row->{track_name}) ne lc($record->{track}))
            {
                $match_ok = 0;
                last;
            }
            $albums_seen{$row->{album_id}} = 1;
            $product_id ||= $row->{product_id};

        }
    }

    return $product_id || undef;
}

DESTROY {
	my $self = shift;
	
	if (defined $self->{regexp_sql}) {
		foreach my $sql_href (@{$self->{regexp_sql}}) {
			$sql_href->{sth}->finish();
		}
	}
	
}

1;

