#!/usr/bin/perl
#

use strict;

use Getopt::Std;
use File::Basename;

my %opt;
usage() unless getopts( 'c:a:qhldv', \%opt );

if ( $opt{l} ) {
    list_clients( $ARGV[0] );
}

if ( $opt{h} ) {
    usage();
}

my $controller = new DeleteAlbum(
    client_id => $opt{c},
    album_id  => $opt{a},
    quiet     => $opt{q},
    verbose   => $opt{v},
    debug     => $opt{d}
);

$controller->run();

sub usage {
    my $prog = basename $0;

    print <<EofUSAGE;

usage: $prog -c client_id -a album_id [-l client_name/pattern] [-h] [-d]
            -c - Client ID
            -a - Album ID
            -l - List client ids (host pattern is optional)
            -d - display debug information to STDERR
            -v - display verbose debug information to STDERR
            -q - Do not output summary report
            -h - display this screen
EofUSAGE

    exit 1;
}

sub list_clients {
    my $host = shift;
    my $key;
    foreach $key ( sort { $a <=> $b } keys(%Common::RSDB::CLIENT_DB) ) {
        printf( "%-20s %-10s ID: %s\n", $Common::RSDB::CLIENT_DB{$key}->{db_name}, "($Common::RSDB::CLIENT_DB{$key}->{host_id})", $key )
          if ( !defined($host) || $Common::RSDB::CLIENT_DB{$key}->{db_name} =~ /$host/i );
    }
    exit 1;
}

package DeleteAlbum;

use lib '/app/tools/common/lib';
use Common::RSApp;
use Common::Util;
use Common::Assert;
use Common::WriteXML;

use lib '/app/tools/common/lib';
use base 'Common::Script';

use lib '/app/tools/rps/lib';
use base 'RPS::Catalog::Album';
use RPS::DB::Item::Album;
use RPS::DB::Item::Product;

use Distribution::DB::Item::ProductServiceID;
use Distribution::DB::Item::ProductTrackServiceID;
use RPS::DB::Item::ProductTrack;
use RPS::DB::Item::Product;

use Data::Dumper;

sub _init {
    my $self = shift;
    my %args = @_;
    $self->SUPER::_init(@_);

    assert( $args{client_id}, "Client ID Required" );
    assert( $args{album_id},  "Album ID Required" );

    $self->{_albumID} = $args{album_id};

    return $self;
}

sub _process {
    my $self     = shift;
    my $clientID = Common::RSApp::GetClientID();

    if ( $self->_canDelete() ) {
        $self->_deleteAlbum();
    }
}

sub _canDelete {
    my $self = shift;

    my $album = RPS::DB::Item::Album->Lookup( album_id => $self->{_albumID} );

    unless ($album) {
        print STDERR "Album ID $self->{_albumID} does not exist.\n";
        return;
    }

    if ( $self->_hasSales() ) {
        print STDERR "Album ID $self->{_albumID} has sales associated, can't delete.\n";
        return;
    }

    if ( $self->_hasContracts() ) {
        print STDERR "Album ID $self->{_albumID} has contracts associated, can't delete.\n";
        return;
    }

    if ( $self->_hasLicenses() ) {
        print STDERR "Album ID $self->{_albumID} has licenses associated, can't delete.\n";
        return;
    }

    return 1;
}

sub _hasSales {
    my $self = shift;

    return RPS::DB::Item::Album->HasAlbumSales( $self->{_albumID} ) || RPS::DB::Item::Album->HasTrackSales( $self->{_albumID} );
}

sub _hasContracts {
    my $self = shift;
    return RPS::DB::Item::Album->HasAlbumContracts( $self->{_albumID} ) || RPS::DB::Item::Album->HasTrackContracts( $self->{_albumID} );
}

sub _hasLicenses {
    my $self = shift;
    return RPS::DB::Item::Album->HasUSLicenses( $self->{_albumID} )
        || RPS::DB::Item::Album->HasCALicenses( $self->{_albumID} )
        || RPS::DB::Item::Album->HasUKLicenses( $self->{_albumID} );
}

sub _deleteAlbum {
    my $self = shift;
    RPS::DB::Item::Album->DeleteAlbum( $self->{_albumID} );
}

1;
