#------------------------------------------------------------
# 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;
