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

use strict;
use warnings;

use Data::Dumper;

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

use lib '/app/tools/rps/lib';
use RPS::DB::Item::Track;
use RPS::DB::Item::Artist;
use RPS::DB::Item::TrackLicense;
use RPS::DB::Item::TrackContract;

#use RPS::DB::Item::ProductTrack;
#use RPS::DB::Item::Product;
use RPS::Master::Master;
use RPS::DB::Item::Album;

use Common::FormObject;

use RPS::Track::Track;
use base 'RPS::Track::Track';

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

    my $dbObj = $self->_saveTrack();
    $self->_saveProductTrack($dbObj);
    $self->{AdditionalArtistList}->save( trackID => $self->TrackID )
      if ( $self->{AdditionalArtistList} );
    $self->_init( _dbItem => $dbObj );
}

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

    if ( $self->Delete() ) {
        $self->delete($albumID);
        return;
    }

    if ( !$self->{_hasData} ) {
        return;
    }

    $self->AlbumID($albumID);

    #$self->TrackOrder($$trackOrderRef++);

    my $dbObj = $self->_saveTrack();

    #$self->_saveProductTrack($dbObj, $productID);
    $self->_init( _dbItem => $dbObj );
}

sub _saveProductTrack {
    my ( $self, $trackDBObj ) = @_;

    my $albumProduct = RPS::DB::Item::Product->GetDigitalAlbumProduct( $self->AlbumID() );

    # Create/update the track product for this track.
    #
    my $trackProduct = RPS::DB::Item::Product->GetDigitalTrackProduct( $trackDBObj->track_id, $albumProduct->product_id );
    if ( !$trackProduct ) {
        $trackProduct = RPS::DB::Item::Product->Create(
            product_type_id   => RPS::DB::Item::Product::kProductTypeDigitalTrack,
            parent_product_id => $albumProduct->product_id,
            asset_id          => $trackDBObj->track_id,
        );
    }

    # Sync the track product with the main digital album product.
    #
    $trackProduct->product_code( $albumProduct->product_code );
    $trackProduct->upc_ean( $albumProduct->upc_ean );
    $trackProduct->release_date( $albumProduct->release_date );
    $trackProduct->product_status_id( $albumProduct->product_status_id );

    $trackProduct->save();

    # Create/update the product_track table entry
    #
    # !!! Here is my chance to set the disc and track num correctly...
    #
    my $productTrack = RPS::DB::Item::ProductTrack->Lookup(
        product_id => $albumProduct->product_id,
        track_id   => $trackDBObj->track_id,
    );

    if ( !$productTrack ) {
        my ( $nextDiscNum, $nextDiscTrack ) = RPS::DB::Item::ProductTrack->GetNextDiscNumAndDiscTrack( $albumProduct->product_id );
        $productTrack = RPS::DB::Item::ProductTrack->Create(
            product_id  => $albumProduct->product_id,
            track_id    => $trackDBObj->track_id,
            disc_number => $nextDiscNum,
            disc_track  => $nextDiscTrack,
        );
    }

    #    $productTrack->disc_number($self->DiscNumber());
    #    $productTrack->disc_track($self->DiscTrack());
    $productTrack->save();
}

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

    # Does this track actually _exist_?
    #
    my $trackID = $self->TrackID();
    return unless $trackID;

    # delete the Master
    #
    #    $self->{Master}->delete();

    # Delete the product_track table entry
    #
    #    my $productTrack = RPS::DB::Item::ProductTrack->Lookup
    #    (
    #        product_id => $productID,
    #        track_id => $trackID,
    #    );
    #    if ($productTrack)
    #    {
    #        $productTrack->delete();
    #    }

    # Delete the track product for this track.
    #
    #    my $trackProduct = RPS::DB::Item::Product->GetDigitalTrackProduct($trackID);
    #    if ( $trackProduct)
    #    {
    #        $trackProduct->delete();
    #    }

    # Delete the track
    #
    my $track = RPS::DB::Item::Track->Lookup( track_id => $trackID );
    if ($track) {
        $track->delete();
    }

    return 1;
}

# The container will want to know whether a track has data, so it can choose to ignore it
# when re-ordering the tracks.
#
sub hasData {
    my ($self) = @_;
    return $self->{_hasData};
}

###
1;    # Play nicely.
###
