#------------------------------------------------------------
# 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})      . " 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 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;
