#------------------------------------------------------------
# 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, NULL ) ) as primary_genre, "
      . "GROUP_CONCAT( IF( genre_id = $sGenre, genre_name, NULL ) ) 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;
