package Audio::Tagger::Meta;
use strict;
use warnings;
use base qw(Class::Accessor);
use Audio::Tagger::Error;

Audio::Tagger::Meta->mk_accessors(qw/artist track album/);
sub get {
	my ($self, $field) = @_;

	throw Audio::Tagger::Meta::Error("Audio::Tagger::Meta::$field does not exsist.") if $field !~ m/^(artist|track|album)$/;

	my $temp = "Audio::Tagger::Meta::" . ucfirst($field);
	$self->{$field} = $temp->new unless defined $self->{$field};

	return $self->{$field};
}

sub set {
	my  ($self, $field, $value) = @_;
	unless (defined $self->{$field}) {
		my $class = "Audio::Tagger::Meta::" . ucfirst $field;
		return $self->{$field} = $class->new($value);
	}
	while (my ($k,$v) = each %{$value}) {

		$self->{$field}->{$k} = $v;
	}
	bless $self->{album}->{artist}, "Audio::Tagger::Meta::Artist" if $field eq "album";
	return $self->{$field};
}

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

	$self->{artist} = Audio::Tagger::Meta::Artist->new($conf->{artist});
	$self->{track}  = Audio::Tagger::Meta::Track->new($conf->{track});
	$self->{album}  = Audio::Tagger::Meta::Album->new($conf->{album});

	return $self;
}

sub _meta {
	my ($self, $meta) = @_;

	$meta->artist->sortname;
	$meta->album->artist->sortname;
	$meta->album->artist->name;

	$self->artist($meta->artist);
	$self->track($meta->track);
	$self->album($meta->album);
}
1;

package Audio::Tagger::Meta::Album;

use base qw(Class::Accessor::Fast);
Audio::Tagger::Meta::Album->mk_accessors(qw/id count name artist/);

sub new {
	my ($class, $conf) = @_;
	my $self = {};

	$self->{count}  = $conf->{count} if defined $conf->{count};
	$self->{id}     = $conf->{id}    if defined $conf->{id};
	$self->{name}   = $conf->{name}  if defined $conf->{name};

	$self->{artist} = Audio::Tagger::Meta::Artist->new($conf->{artist});

	bless $self, $class;
	return $self;
}

sub artist {
	my ($self, $artist) = @_;
	return $self->{artist} if not defined $artist;

	$self->{artist}->{name}     = $artist->{name}     if defined $artist->{name};
	$self->{artist}->{sortname} = $artist->{sortname} if defined $artist->{sortname};
	$self->{artist}->{id}       = $artist->{id}       if defined $artist->{id};

	return $self->{artist};
}

1;
package Audio::Tagger::Meta::Artist;

use base qw(Class::Accessor::Fast);
Audio::Tagger::Meta::Artist->mk_accessors(qw/id name sortname/);

1;

# TODO Move score?? a track should not have a score, a lookup result that isa
# meta should have one

package Audio::Tagger::Meta::Track;

use base qw(Class::Accessor::Fast);
Audio::Tagger::Meta::Track->mk_accessors(qw/id name number score/);
Audio::Tagger::Meta::Track->mk_ro_accessors(qw/duration/);

# TODO remove before release
sub bitrate    {throw Audio::Tagger::Meta::Error("This function has been moved.");}
sub length     {throw Audio::Tagger::Meta::Error("This function has been moved.");}
sub samplerate {throw Audio::Tagger::Meta::Error("This function has been moved.");}

1;
# TODO Document AUdio::Tager::Meta::* ...

__DATA__

=head1 NAME

Audio::Tagger::Meta Simple OO object for storing information about songs.

=head1 SYNSOPSIS

	my $meta   = Audio::Tagger::Meta->new({
		artist => {
			name     => '',
			sortFilne=> '',
			id       => '',}
		album  => {
			name     => '',
			count    => '',
			id       => '',}
		track  => {
			name     => '',
			length   => '',
			number   => '',}
		file   => {
			full     => '',}});


	my $artist = $meta->artist;
	my $album  = $meta->album;
	my $track  = $meta->track;
	my $file   = $meta->file;

=head1 DESCRIPTION

The following functions are accessor for the underlying Audio::Tagger::Meta::*
objects.

=over

=item artist

Return an Audio::Tagger::Meta::Artist object.

=item album

Return an Audio::Tagger::Meta::Album object.

=item track

Return an Audio::Tagger::Meta::Track object.

=item file

Return an Audio::Tagger::Meta::File object.

=back

=head1 SEE ALSO

	Audio::Tagger::Meta::Artist
	Audio::Tagger::Meta::Album
	Audio::Tagger::Meta::Track
	Audio::Tagger::Meta::File
