######################################################################
#
#  EPrints Staff Submission Editing Page
#
######################################################################
#
#  __LICENSE__
#
######################################################################

use EPrints::Utils;
use EPrints::EPrint;
use EPrints::Database;
use EPrints::Session;
use EPrints::User;
use EPrints::SubmissionForm;
use EPrints::MetaField;

use strict;

my $session = new EPrints::Session();

# Check we have privs
if( !$session->auth_check( "editor" ) )
{
	$session->terminate();
	Apache::exit( 0 );
}

process( $session );

$session->terminate();

sub process
{
	my( $session ) = @_;

	# Work out whether Accept or Reject buttons pressed
	my $action = $session->get_action_button();
	my $stage = $session->param( "stage" );
	my $eprintid = $session->param( "eprintid" );

	# If we are skipping the files stage then we have to work out what the
	# actual last stage is...
	my $laststage = "files";
	my @stages = ( "meta","linking","type" );
	while( $session->get_archive()->get_conf( "submission_stage_skip", $laststage ) )
	{
		$laststage = pop @stages;
		last if( $laststage eq "type" );
	}

	if( defined $stage && $laststage eq $stage && defined $action && ($action eq "finished" || $action eq "next") )
	{
		# Intercept the verify page, that's what we were doing!
		$session->redirect( "view_submission?eprintid=$eprintid" );
		return;
	}

	my $bufferds = $session->get_archive()->get_dataset( "buffer" );
	
	if( !defined $eprintid || $eprintid eq "" )
	{
		$session->render_error( $session->html_phrase( "general:bad_param" ) );
		return;
	}

	my $eprint = new EPrints::EPrint( $session, $bufferds, $eprintid );

	if( !defined $eprint )
	{
		$session->render_error( 
			$session->html_phrase( 
				"cgi/users/edit_submission:problem_getting", 
				eprintid => $session->make_text( $eprintid ) ) );
		return;
	}

	# Specialist cases, not for Submission Form
	
	if( $action eq "accept" )
	{	
		# Accept button pressed
		&accepted( $session, $eprint );
		return;
	}

	if( $action eq "bounce" )
	{
		# Bounce button pressed - get reason
		&bounce_form( $session, 0, $eprint );
		return;
	}

	if( $action eq "delete" )
	{
		# Delete button pressed - get reason
		&bounce_form( $session, 1, $eprint );
		return;
	}

	if( $action eq "send" )
	{
		# Actually do the bounce
		&bounce( $session, $eprint );
		return;
	}

	# Give other cases to the edit form
	my $subform = new EPrints::SubmissionForm(
		$session,
		"view_submission?eprintid=$eprintid",
		1,
		$bufferds,
		"edit_submission" );

	$subform->process();
	return;

}

	
	

sub accepted
{
	my( $session, $eprint ) = @_;

	if( $eprint->move_to_archive() )
	{
		# Successfully archived, redirect
		$session->redirect( "buffer" );
	}
	else
	{
			#not DOM not LANG cjg!!!
		$session->render_error(
			"Problem committing submission to archive. Please check the ".
				"logs.",
			"buffer",
			"Return to Submission Buffer Overview" );
	}
}


sub bounce_form
{
	my( $session, $delete, $eprint ) = @_;

	# Get the user's details
	my $user = $eprint->get_user();
	if( !defined $user )
	{
		# Can't find the user
		$session->render_error( 
			$session->html_phrase( "cgi/users/edit_submission:no_user" ),
			"buffer" );
		return;
	}

	my $page = $session->make_doc_fragment();
	
	$page->appendChild( $session->html_phrase( "cgi/users/edit_submission:bounce_form_intro", langpref=>$user->render_value( "lang" ) ) );
	my $form = $session->render_form( "post", "edit_submission" );
	my $div = $session->make_element( "div", class => "formfieldinput" );
	my $textarea = $session->make_element(
		"textarea",
		name => "reason",
		rows => 20,
		cols => 60,
		wrap => "virtual" );

	# remove any markup:
	my $title = $session->make_text( EPrints::Utils::tree_to_utf8( $eprint->render_description() ) );

	$textarea->appendChild( $session->html_phrase(
		( $delete ? "mail_delete_reason" : "mail_bounce_reason" ),
		title => $title ) );
	$div->appendChild( $textarea );
	$form->appendChild( $div );

	$form->appendChild( $session->render_hidden_field( "eprintid", $eprint->get_value( "eprintid" ) ) );
	$form->appendChild( $session->render_hidden_field( "delete", $delete ) );

	$form->appendChild( $session->render_action_buttons(
		"send" => $session->phrase( "cgi/users/edit_submission:action_send" ) ) );

	$page->appendChild( $form );

	$session->build_page(
		$session->html_phrase( "cgi/users/edit_submission:title_".( $delete ? "delete" : "bounce" )."_form" ),
		$page );
	$session->send_page();
}


sub bounce
{
	my( $session, $eprint ) = @_;

	# Get the user's details
	my $user = $eprint->get_user();
	if( !defined $user )
	{
		# Can't find the user
		$session->render_error( 
			$session->html_phrase( "cgi/users/edit_submission:no_user" ),
			"buffer" );
		return;
	}
	
	my $delete = $session->param( "delete" );
	my $success = 0;
	
	if( $delete )
	{
		# Delete the submission
		$success = $eprint->remove();
	}
	else
	{
		# Transfer the EPrint back to the user's inbox
		$success = $eprint->move_to_inbox();
	}
	
	unless( $success )
	{
		# Couldn't be bounced at all
		$session->render_error( 
			$session->html_phrase( "cgi/users/edit_submission:bord_fail" ),
			"buffer" );
		return;
	}
	my $mail = $session->make_element( "mail" );
	$mail->appendChild( $session->make_text( $session->param( "reason" ) ) );

	# Successfully transferred, mail the user with the reason
	if( $user->mail(
		"cgi/users/edit_submission:subject_bounce",
		$mail,
		$session->current_user() ) )
	{	
		# Successfully bounced, redirect
		$session->redirect( "buffer" );
		return;
	}

	# Couldn't mail
	$session->render_error( 
		$session->html_phrase( "cgi/users/edit_submission:mail_fail",
			username=>$user->render_value( "username" ),
			email=>$user->render_value( "email" ) ),
		"buffer" );
}
