package Metadata::Validate::Album;
use strict;

use lib '/app/tools/common/lib';
use Common::Log;
use Common::RSApp;
use Common::Assert;

use lib '/app/tools/metadata/lib';
use base 'Validate::Item';

use Metadata::Rule::Album::Sequential;
use Metadata::Rule::Album::Unique;
use Metadata::Rule::Album::Common;
use Metadata::Rule::Album::UPCUnique;
use Metadata::Rule::Album::UniqueClientID;

use vars qw($AUTOLOAD);

use constant kClassAttributes => qw();

use constant kGroupField => qw( catalog_no );

use constant kValidationRules => qw( Metadata::Rule::Album::Sequential
  Metadata::Rule::Album::Unique
  Metadata::Rule::Album::UniqueClientID
  Metadata::Rule::Album::UPCUnique
  Metadata::Rule::Album::Common );

sub new {
    my ( $class, %args ) = @_;
    my $self = bless {}, $class;

    return $self->_init(%args);
}

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

    # Build a hash with our valid class attributes
    foreach ( (kClassAttributes) ) {
        $self->{_attributes}->{$_}++;
    }

    foreach ( (kValidationRules) ) {
        $self->_add_rule( rule => $_->new() );
    }

    # Set any attributes passed in
    foreach ( keys(%args) ) {
        $self->$_( $args{$_} ) if ( $self->{_attributes}->{$_} );
    }

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

    return $self;
}

sub AUTOLOAD {
    my $self    = shift;
    my ($value) = @_;
    my $field   = $AUTOLOAD;
    $field =~ s/.*://;    # Strips fully-qualified portion.

    my $attr = "_$field";

    return if $field eq 'DESTROY';    # skip DESTROY and all-cap methods

    unless ( $self->{_attributes}->{$field} ) {
        my $superior = "SUPER::$attr";
        $self->$superior(@_);
    }

    # All preconditions are validated.  Let's do some work.

    # If a value is sent in, then set it.
    $self->{$attr} = $value
      if ($value);

    return $self->{$attr};
}

1;
