package Metadata::Dumper;

use lib '/app/tools/common/lib';
use Common::Assert;
use Data::Dumper;

use lib '/app/tools/rps/lib';
use RPS::Catalog::AlbumList;
use RPS::Catalog::TrackHash;
use RPS::Product::ProductList;
use RPS::Product::ProductDigitalWithServices;
use RPS::Label::Label;

use base 'Common::XMLObject';

sub _init {
    my $self = shift;
    my %args = @_;

    $self->{_albumID} = $args{albumID};
    $self->{_raw}     = $args{raw};

    $self->{_Albums} = $self->_getAlbums();
    return $self;
}

sub translate {
    my $self = shift;
    my $xmlString = Common::WriteXML::GetXMLString( $self->{_Albums}, undef, skip_array_indexing => 1 );

    if ( $self->{_raw} ) {
        return $xmlString;
    } else {
        return $self->_transform( $xmlString, $self->_getTransformFile() );
    }
}

sub _getAlbums {
    my $self = shift;
    my $albumList;
    my $albums;

    if ( $self->{_albumID} ) {
        $albumList->{Album} = new RPS::Catalog::Album( albumID => $self->{_albumID} );
        $albums = [ $albumList->{Album} ];
    } else {
        $albumList = new RPS::Catalog::AlbumList( albumID => $self->{_albumID} );
        $albums = $albumList->getAlbums();
    }

    return unless ($albums);

    foreach my $album (@$albums) {
        $album->{Label}    = $self->_getLabel($album);
        $album->{Tracks}   = $self->_getTracks($album);
        $album->{Products} = $self->_getProducts($album);
    }

    return $albumList;
}

sub _getLabel {
    my $self  = shift;
    my $album = shift;

    assert($album);

    return new RPS::Label::Label( labelID => $album->LabelID );
}

sub _getTracks {
    my $self  = shift;
    my $album = shift;

    assert($album);

    my $trackList = new RPS::Catalog::TrackHash( albumID => $album->AlbumID );

    return $trackList;
}

sub _getProducts {
    my $self  = shift;
    my $album = shift;

    assert($album);

    my $productList = new RPS::Product::ProductList( albumID => $album->AlbumID );
    my $products = $productList->getProducts();

    return $productList unless ($products);

    foreach my $product (@$products) {
        $product->{ProductDigital} = $self->_getProductDigital($product);
    }

    return $productList;
}

sub _getProductDigital {
    my $self    = shift;
    my $product = shift;

    assert($product);

    return new RPS::Product::ProductDigitalWithServices( productID => $product->ProductID );
}

1;
