#------------------------------------------------------------
# Copyright (C) 2011 RoyaltyShare, Inc.   All Rights Reserved
#------------------------------------------------------------
package RPS::Report::Dynamic::Command::Show;
use strict;
use warnings;


use Data::Dumper;

use lib '/app/tools/common/lib';
use RSApache::Response::XSLTTemplate;
use Common::Util;

use lib '/app/tools/rps/lib';
use RPS::CommandLog;
use RPS::Report::Dynamic::Factory;
use RPS::Report::Dynamic::Command::List;

use base 'RPS::Command';

sub cmd  { return 'show'; }
sub area { return 'report'; }

use constant kTemplate => "/app/tools/rps/templates/report/dynamic/show.xsl";

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

    my $params;

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

# !!! Don't want or need to log this command.
#    RPS::CommandLog::Log($self);

    my $type     = $self->getParam('Type');
    my $group    = $self->getParam('Group');
    my $reportID = $self->getParam('ReportID');
    my $report;

    if( $reportID ) {
        $report = RPS::Report::Dynamic::Factory->Fetch( $reportID );
        die "TODO:  Report not found (id: $reportID)" unless( $report );
        $params = $report->parameters();
    } elsif( $type && $group ) {
        $report = RPS::Report::Dynamic::Factory->ClassFromGroupType( $group, $type );
        die "TODO:  Report type not found" unless( $report );
        $params = $report->NewParameters();
    } else {
        die "TODO:  Parameters Required";
    }

    my $newReportID;
    if( $newReportID = $self->saveOnSubmit( $report, $params ) ) {
        my $command = RPS::Report::Dynamic::Command::List->new(Highlight => $newReportID);
        return RSApache::Response::Redirect->new($command->getRedirect());
    }

    $self->{xml}->{Form}->{Parameters} = $params;
    $self->{xml}->{Form}->{Report}     = $report;

    $response = RSApache::Response::XSLTTemplate->new($self->{xml}, kTemplate);

    return $response;
}

sub saveOnSubmit {
    my $self = shift;
    my $report = shift || die;
    my $params = shift || die;
    my $notifyUserID = $self->_notifyUserID();

    return unless( $self->getParam( 'FormSubmit' ) );

    die unless( $params->assignCGIParams( 'Parameters', $self->getParams ) );

    # If we have been given a report ID then we want to "regenerate" the report.
    if( $self->getParam( 'ReportID' ) ) {
        $report = RPS::Report::Dynamic::Factory->ClassFromGroupType( $report->Group, $report->Type );
    }

    #die "TODO: Validation failed" unless( $params->validate() );

    # Only save new reports
    die "TODO: Can not save an already existing report.  Create a new one." if( ref($report) && $report->reportID );

    # QueueReport returns a Report object, which we are currently ignoring.
    # If we've detected a duplicate report, do we want to actually bother notifying the user?
    # (Because we will NOT have bothered to queue the dup in that case).
    my $queuedReport = $report->QueueReport( parameters => $params, notify => $notifyUserID );
    return 0 unless $queuedReport;
    return $queuedReport->reportID();
}

sub _notifyUserID {
    my $self = shift;
    my $notify = $self->getParam( "Notify" );

    return $notify ? Common::RSApp::GetActiveUserID() : undef;
}

1;
