package Sale::Match::SRGI;

use strict;
use warnings;

use base '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} ) ) {
            Sale::Match::DEBUG && print STDERR "srgi match $in{data}->{track} $in{data}->{isrc} to $product_id\n";

            $result = new Sale::Match::Result(
                products        => [$product_id],
                num_products    => 1,
                import_status   => 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;

