#------------------------------------------------------------
# Copyright (C) 2006 RoyaltyShare, Inc.   All Rights Reserved
#------------------------------------------------------------
package RPS::Catalog::AdditionalArtist;

use strict;
use warnings;

use Data::Dumper;

use lib '/app/tools/rps/lib';
use RPS::DB::Item::Artist;
use RPS::ArtistRole;
use Common::FormObject;

use base 'RPS::Catalog::Artist';

sub _init
{
	my ($self, %args) = @_;

	$self->SUPER::_init(%args);

    my %properties;
	if ($args{_dbItem})
	{
		$self->_propertiesFromDBItem(\%properties, $args{_dbItem});
	}
	elsif ($args{artistID} && $args{roleID})
	{
		$self->_propertiesFromDB(\%properties, %args);
	}
	else
	{
		$self->_propertiesFromDefaults(\%properties);
	}

    $self->_initProperties(\%properties);
    $self->_initSubs(\%properties);

    return $self;
}

sub _propertiesFromDB
{
	my ($self, $hrProperties, %args) = @_;

	my $dbItem = RPS::DB::Item::Artist->Lookup(artist_id => $args{artistID});

    $hrProperties->{artist_role_id} = $args{artistRoleID};

	$self->_propertiesFromDBItem($hrProperties, $dbItem);
}

sub _propertiesFromDBItem
{
    my ($self, $hrProperties, $dbItem) = @_;

	$hrProperties->{artist_role_id}       = $dbItem->{artist_role_id};
    $hrProperties->{additional_artist_id} = $dbItem->{additional_artist_id};

    $self->SUPER::_propertiesFromDBItem( $hrProperties, $dbItem );
}

sub _initProperties
{
	my ($self, $props) = @_;

    $self->SUPER::_initProperties( $props );

    $self->{AdditionalArtistID}   = Common::FormObject::Scalar->new( value => $props->{additional_artist_id} );
    $self->{OriginalKey}   = Common::FormObject::Scalar->new();
    $self->{ArtistRoleID}  = Common::FormObject::Scalar->new( value => $props->{artist_role_id} );

    $self->{Delete}        = Common::FormObject::Scalar->new();

    $self->{New}  = $self->AdditionalArtistID() ? 0 : 1;

	$self->{Role} = new RPS::ArtistRole( artistRoleID => $self->ArtistRoleID );
}

sub _accessProperty
{
	my $self = shift;
	my %args = @_;

	my $result = $self->SUPER::_accessProperty(@_);

	$self->{Role} = new RPS::ArtistRole( artistRoleID => $self->ArtistRoleID );

	return $result;
}

sub validate {
    my $self = shift;
	my %args = @_;

    return 1 if( $self->Delete() );

	$self->{Name}->setError(Common::FormObject::kErrFieldBlank)
	    unless( $self->Name() );

	$self->{ArtistRoleID}->setError(Common::FormObject::kErrRequiredFields)
	    unless( $self->ArtistRoleID );

	return $self->Name() && $self->ArtistRoleID();
}

sub save { die "Not Overloaded" }

sub hasChanged {
    my $self = shift;
    my $key = shift;
    my $oldInfo = $self->parseKey($key);

    if( $oldInfo->{artistID} != $self->ArtistID ) {
        return 1;
    }

    if( $oldInfo->{artistRoleID} != $self->ArtistRoleID ) {
        return 1;
    }

    return ;
}

sub hashKey { die "Not Overloaded" }

sub _getArtistID {
	my $self = shift;

	my $artistObj;

	# Check to see if the name has changed
	if($self->ArtistID() && $self->Name())
	{
		$artistObj = RPS::DB::Item::Artist->Lookup(artist_id => $self->ArtistID());

		if(lc($artistObj->name) ne lc($self->Name()))
		{
			$artistObj = RPS::DB::Item::Artist->Create(name => $self->Name());
      ## only good place to set the clean name for artists atm
      $artistObj->name_clean(Common::Util::clean_name_catalog($self->Name()));
			$artistObj->save();

      # If the name is the same, but different case
    } elsif( $artistObj->name ne $self->Name() ) {
      $artistObj->name( $self->Name );
      $artistObj->save();
    }
	}

	# We (may) need to create a new artist.
	elsif($self->Name())
	{
	  #  Let's see if we have an artist with this name already.
	  #
    $artistObj = RPS::DB::Item::Artist->Lookup(name => $self->Name());
		if(defined $artistObj && lc($artistObj->name) eq lc($self->Name()))
		{
      # Do nothing.  We don't want to make a duplicate entry.
		}
	  else 
	  {
		  # Create a new artist.
		  $artistObj = RPS::DB::Item::Artist->Create(name => $self->Name());
      ## only good place to set the clean name for artists atm
      $artistObj->name_clean(Common::Util::clean_name_catalog($self->Name()));
		  $artistObj->save();
		}
	}

	return $artistObj ? $artistObj->artist_id : undef;
}

1;
