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

use lib '/app/tools/rps/lib';
use RPS::DB::Item::Album;

use lib '/app/tools/common/lib';
use Common::DB::Item;
use Common::RSApp;

use base 'Common::DB::Item';

use constant kTable => 'genre';
use constant kDB => Common::DB::Item::kCommonDB();

sub GetAll
{
	my $class = shift;
	my $sql = shift || "SELECT * FROM " . kTable . " ORDER BY genre_name";

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

sub GetAllGenres
{
	my $sql = "SELECT * FROM ".kTable;

	my $collection = Common::DB::ItemCollection->new(
	 class => "RPS::DB::Item::Genre",
	 query => $sql,
     dbID => kDB
	);

	return $collection;
}

sub LookupWithMap {
    my $class = shift;
    my %args = @_;

    my $name = $args{genre_name};
    my $serviceID = $args{service_id};

    my $dbo = Common::RSApp::GetCommonDB();
    my $sql = "SELECT genre.*, genre_service_map.genre_name as map_name, " .
                     "service_id " .
              "FROM " . kTable . " " .
                  " LEFT JOIN genre_service_map " .
                     " ON ( genre.genre_id = genre_service_map.genre_id AND " . 
                           "service_id = " .$dbo->DBQuote($serviceID) . " ) " .
              "WHERE genre.genre_name = " . $dbo->DBQuote($name);

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

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

sub isComposerRequired
{
    my %args = @_;
    my $dbo = Common::RSApp::GetCommonDB();
    my $sql;
    my @criteria;

    #assert( defined($args{album_id}) || defined($args{genre}) );

    if( $args{album_id} ) {
        my $album = RPS::DB::Item::Album->Lookup( album_id => $args{album_id} );

        # Bail if we couldn't find the album or it doesn't have any genres.
        return undef
            unless( $album && ( $album->genre_primary_id() || $album->genre_secondary_id() ) );

        push( @criteria, $dbo->DBQuote($album->genre_primary_id()) )
            if( $album->genre_primary_id() );
        push( @criteria, $dbo->DBQuote($album->genre_secondary_id()) )
            if( $album->genre_secondary_id() );

        $sql =  "SELECT COUNT(require_composer) " .
		        "FROM genre " .
                "WHERE genre_id IN ( " . join( ',', @criteria ) . ") ";
	}
	elsif( $args{genre} ) {
        $sql =  "SELECT require_composer FROM " . kTable .
                " WHERE genre_name = " . $dbo->DBQuote( $args{genre} );

	}
	elsif( $args{genre_id} ) {
        $sql =  "SELECT require_composer FROM " . kTable .
                " WHERE genre_id = " . $dbo->DBQuote( $args{genre_id} );
	}

    # New genre means no composer required
    else { return undef }

	Common::Log::Debug( "QUERY: $sql" );
	my $sth = $dbo->DoCmd($sql) || return undef;

    my ($required) = $sth->fetchrow_array();

    return $required ? "1" : "0";
}

sub getGenreNames
{
    my $self = shift;
	my %args = @_;
    my $dbo = Common::RSApp::GetCommonDB();
    my $sql;
    my @criteria;

    return () unless( $args{album_id} );

    my $album = RPS::DB::Item::Album->Lookup( album_id => $args{album_id} );

    # Bail if we couldn't find the album or it doesn't have any genres.
    return undef
        unless( $album && ( $album->genre_primary_id() || $album->genre_secondary_id() ) );

    my $pGenre = $album->genre_primary_id()   ? $dbo->DBQuote($album->genre_primary_id()) : "''";
    my $sGenre = $album->genre_secondary_id() ? $dbo->DBQuote($album->genre_secondary_id()) : "''";

    $sql =  "SELECT GROUP_CONCAT( IF( genre_id = $pGenre, genre_name, \\N ) ) as primary_genre, " .
	               "GROUP_CONCAT( IF( genre_id = $sGenre, genre_name, \\N ) ) as secondary_genre " .
	        "FROM genre " .
            "WHERE genre_id IN ( $pGenre, $sGenre ) ";

	Common::Log::Debug( "QUERY: $sql" );
	my $sth = $dbo->DoCmd($sql) || return undef;

    return $sth->fetchrow_array();
}

1;
