package RPS::Catalog::Command::Delete;

use strict;
use warnings;

use RPS::Command;
use RPS::CommandLog;
use parent 'RPS::Command';

use lib '/app/tools/common/lib';
use Common::FormObject;
use RSApache::Response::XML;
use RSApache::Response::XSLT;
use RSApache::Response::Redirect;

use RPS::Catalog::Command::Main;
use RPS::Catalog::Command::Edit;
use RPS::DB::Item::Album;


# this action is available only from the "Edit" form
sub cmd  { return 'edit'; }
sub area { return 'catalog'; }

use constant kTemplate => "/app/tools/rps/templates/catalog/index.xsl";

sub execute {
    my $self = shift;

    my $response = $self->SUPER::execute();
    return $response if $response;

    my $status;
    my $id = $self->getParam('AlbumID') || 0;
    if ( $id && $id =~ /^\d+$/) {
        if ( $self->_isAlbum($id) ) {
            # an album has related items
            if ( $self->_hasAlbumItems($id) ) {
                return $self->_renderEditAlbumForm( $id, Common::FormObject::kErrAlbumHasItems );
            }
            # delete an album
            if ( !$self->_deleteAlbum($id) ) {
                return $self->_renderEditAlbumForm( $id, Common::FormObject::kErrDelete );
            }

            $status = 'success';
        }
    }

    return $self->_redirectToMainAlbumsPage($status);
}

sub _renderEditAlbumForm {
    my ($self, $id, $errorMessage) = @_;

    my $form = RPS::Catalog::EditForm->new( albumID => $id );
    $form->setError($errorMessage);
    $self->addMessageXML( type => "error", code => $errorMessage );
    $self->{xml}{Form} = $form;

    return RSApache::Response::XSLT->new( $self->{xml}, kTemplate );
}

sub _redirectToMainAlbumsPage {
    my ($self, $status) = @_;

    my %showParams;
    if ( $status && $status eq 'success' ) {
        my $msg = RPS::Message->new( type => "success", code => Common::FormObject::kSuccessDelete );
        %showParams = ( msg => $msg->toString() );
    }

    my $cmd = RPS::Catalog::Command::Main->new(%showParams);
    return RSApache::Response::Redirect->new( $cmd->getRedirect() );
}

sub _deleteAlbum {
    my ($self, $id) = @_;
    return RPS::DB::Item::Album->DeleteAlbum($id);
}

sub _hasAlbumItems {
    my ($self, $id) = @_;
    return ( RPS::DB::Item::Album->HasAlbumSales($id)     ||
             RPS::DB::Item::Album->HasTrackSales($id)     ||
             RPS::DB::Item::Album->HasAlbumContracts($id) ||
             RPS::DB::Item::Album->HasTrackContracts($id) ||
             RPS::DB::Item::Album->HasUSLicenses($id)     ||
             RPS::DB::Item::Album->HasCALicenses($id)     ||
             RPS::DB::Item::Album->HasUKLicenses($id)
    )
}

sub _isAlbum {
    my ($self, $id) = @_;
    return RPS::DB::Item::Album->Lookup(album_id => $id);
}

sub _deleteAlbum {
    my ($self, $id) = @_;
    return RPS::DB::Item::Album->DeleteAlbum($id);
}

1;
