package Metadata::Validate::CurrentData;
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::CurrentData::Album;
use Metadata::Rule::CurrentData::Track;

use vars qw($AUTOLOAD);

use constant kClassAttributes => qw( source_column );

use constant kGroupField => qw( catalog_no );

use constant kValidationRules => qw( Metadata::Rule::CurrentData::Album
  Metadata::Rule::CurrentData::Track );

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

sub is_album {
    my $self = shift;

    if (   $self->{_rules}->{'Metadata::Rule::CurrentData::Album'}
        && $self->{_rules}->{'Metadata::Rule::CurrentData::Album'}->is_configured ) {
        return 1;
    }

    return undef;
}

sub is_track {
    my $self = shift;

    if (   $self->{_rules}->{'Metadata::Rule::CurrentData::Track'}
        && $self->{_rules}->{'Metadata::Rule::CurrentData::Track'}->is_configured ) {
        return 1;
    }

    return undef;
}

1;
