#------------------------------------------------------------
# Copyright (C) 2006 RoyaltyShare, Inc.   All Rights Reserved
# $Id$
#------------------------------------------------------------
package RPS::DB::Item::Artist;
use strict;
use warnings;

use lib '/app/tools/common/lib';
use Common::Assert;

use lib '/app/tools/rps/lib';
use base 'Common::DB::Item';

use constant kTable => 'artist';
use constant kDB    => Common::DB::Item::kClientDB();

sub Search {
    my ( $class, %args ) = @_;

    my $searchTerm = $args{searchTerm};
    my $limit      = $args{limit};

    my $where;

    if ($searchTerm) {
        $where = $class->SUPER::SearchSyntax( field => 'name', value => $searchTerm );
    }

    my $sql = 'SELECT * FROM ' . kTable;
    if ($where) {
        $sql .= " WHERE $where";
    }

    $sql .= ' ORDER BY name';

    if ($limit) {
        $sql .= " LIMIT $limit";
    }

    return $class->SUPER::GetAll($sql);
}

sub GetAllAdditionalArtists {
    my $class = shift;
    my %args  = @_;
    my $dbo   = Common::RSApp::GetClientDB();

    assert( $args{album_id} || $args{track_id} );

    my $sql = "SELECT * FROM " . kTable;

    if ( $args{album_id} ) {
        $sql .= " INNER JOIN album_additional_artist USING (artist_id) " . " WHERE album_id = " . $dbo->DBQuote( $args{album_id} );
    } elsif ( $args{track_id} ) {
        $sql .= " INNER JOIN track_additional_artist USING (artist_id) " . " WHERE track_id = " . $dbo->DBQuote( $args{track_id} );
    } else {
        die "You should never be here";
    }

    Common::Log::Debug("QUERY: $sql");
    return $class->SUPER::GetAll($sql);
}

sub LookupWithAlbumAdditionalArtist {
    my $class = shift;
    my %args  = @_;
    my $dbo   = Common::RSApp::GetClientDB();

    assert( $args{album_id} );
    assert( $args{artist_role_id} );
    assert( $args{artist_id} );

    my $sql = "SELECT * FROM " . kTable . " INNER JOIN album_additional_artist " . " USING ( artist_id )";

    my $where =
        " artist_role_id = "
      . $dbo->DBQuote( $args{artist_role_id} ) . " AND "
      . " artist_id      = "
      . $dbo->DBQuote( $args{artist_id} );

    $sql .= " WHERE " . $where;

    my $collection = $class->GetAll($sql);

    Common::Log::Debug("QUERY: $sql");

    return $collection->hasNext ? $collection->next : undef;
}

sub LookupWithTrackAdditionalArtist {
    my $class = shift;
    my %args  = @_;
    my $dbo   = Common::RSApp::GetClientDB();

    assert( $args{track_id} );
    assert( $args{artist_role_id} );
    assert( $args{artist_id} );

    my $sql = "SELECT * FROM " . kTable . " INNER JOIN track_additional_artist " . " USING ( artist_id )";

    my $where =
        " artist_role_id = "
      . $dbo->DBQuote( $args{artist_role_id} ) . " AND "
      . " artist_id      = "
      . $dbo->DBQuote( $args{artist_id} ) . " AND "
      . " track_id       = "
      . $dbo->DBQuote( $args{track_id} );

    $sql .= " WHERE " . $where;

    my $collection = $class->GetAll($sql);
    Common::Log::Debug("QUERY: $sql");

    return $collection->hasNext ? $collection->next : undef;
}

sub GetAllWithAlbumAdditionalArtist {
    my $class = shift;
    my %args  = @_;
    my $dbo   = Common::RSApp::GetClientDB();

    assert( $args{album_id} );

    my $sql = "SELECT * FROM " . kTable . " INNER JOIN album_additional_artist " . " USING ( artist_id )";

    my $where = " WHERE album_id = " . $dbo->DBQuote( $args{album_id} )
      if ( $args{album_id} );

    $sql .= $where;

    Common::Log::Debug("QUERY: $sql");
    return $class->GetAll($sql);
}

sub GetAllWithTrackAdditionalArtist {
    my $class = shift;
    my %args  = @_;
    my $dbo   = Common::RSApp::GetClientDB();

    assert( $args{track_id} );

    my $sql = "SELECT * FROM " . kTable . " INNER JOIN track_additional_artist " . " USING ( artist_id )";

    my $where = " WHERE track_id = " . $dbo->DBQuote( $args{track_id} )
      if ( $args{track_id} );

    $sql .= $where;

    Common::Log::Debug("QUERY: $sql");
    return $class->GetAll($sql);
}

1;
