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


# !!! This class exists because of structural problem we have in our current catalog/track/product XML objects.
# !!! So, basically, this is a 'chimera' class that includes stuff that would normally be in Album/TrackList/Track and
# !!! stuff that would appear in Product/TrackList/Track.
#
# !!! In other words, this is sort of a hack.
#
use strict;
use warnings;

use Data::Dumper;

use lib '/app/tools/rps/lib';
#use RPS::DB::Item::ProductTrack;
use RPS::DB::Item::Track;
use RPS::DB::Item::User;
use RPS::Track::Track;

use Common::FormObject;
use base 'Common::FormHash';


sub _tagName
{
    return 'Track';
}


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

    return undef unless defined $args{albumID};

    $self->{_origAlbumID} = $args{albumID};
    my $collection = RPS::DB::Item::Track->GetTracksByAlbumID($args{albumID});
    return $collection;
}


sub _keyMethodName
{
    return 'TrackID';
}


sub _getNewObject
{
    my ($self) = @_;

    return RPS::Track::Track->new(albumID => $self->{_origAlbumID});
}


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

    return RPS::Track::Track->new(_dbItem => $dbItem);
}



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


    # Stash the albumID away for later
    #
    $self->{_albumID} = $args{albumID};

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

    return $self;
}


sub getKeys
{
    my ($self) = @_;

    # Present the tracks sorted by track_order
    # !!! Might want to have sorting by disc_num, disc_track, track_order
    #
    my @keys = sort { $self->{Track}{$a}->TrackOrder() <=> $self->{Track}{$b}->TrackOrder() } keys %{$self->{Track}};
    return \@keys;

}


sub getKeysSortedByDiscNumberAndDiscTrack
{
    my ($self) = @_;

    my @keys = sort
    {
        my $r = $self->{Track}{$a}->DiscNumber() <=> $self->{Track}{$b}->DiscNumber();
        if (0 == $r)
        {
            $r = $self->{Track}{$a}->DiscTrack() <=> $self->{Track}{$b}->DiscTrack();
        }
        return $r;
    } keys %{$self->{Track}};

    return \@keys;
}

sub getTracks
{
	my ($self) = @_;

	return $self->{Track};
}

sub validate
{
    my $self = shift;
    my %isrc;

    my $valid = $self->SUPER::validate(@_);

    foreach my $trackID ( keys(%{$self->{Track}}) ) {
        my $track  = $self->{Track}->{$trackID};
        my $master = $track->{Master};

        next unless( $master );

        Common::Log::Debug( "MASTER: " . $master->ISRC );
        if( $master->ISRC() && $isrc{$master->ISRC()} ) {
            $master->{ISRC}->setError(Common::FormObject::kErrDuplicateISRC);
            return 0;
        } else {
            $isrc{$master->ISRC} = 1;
        }
    }

    return $valid;
}


sub save
{
    my ($self, $albumID) = @_;

    # Create the album tracks first, then create the track products
    #
    my $keys = $self->getKeys();
    my $trackOrder = 1;
    foreach my $trackID (@$keys)
    {
        my $trackObj = $self->{Track}{$trackID};
        $trackObj->save($albumID, \$trackOrder);
    }
}


1;
