#!/usr/bin/perl
package sdevDbuserCurationPage;

#######################################################################
##### Author :	Shuai Weng
##### Date   :  June 2001
##### Description : This package contains all necessary methods for 
#####               dictyBase curators to enter, update or delete dbuser 
#####               info in oracle database. 
#####              
#######################################################################
use strict;
use DBI;
use CGI qw/:all/;
use CGI::Carp qw(fatalsToBrowser);
use lib "/usr/local/dicty/www_dictybase/db/lib/common";
use Login qw (ConnectToDatabase);
use TextUtil qw( DeleteUnwantedChar );
use lib "/usr/local/dicty/www_dictybase/db/lib/dictyBase";
use dictyBaseCentralMod qw(:formatPage :getInfo :logInfo);
use lib "/usr/local/dicty/www_dictybase/db/lib/dictyBase/Objects";
use ConfigURLdictyBase;
use Update_log;
use Delete_log;
use Dbuser;

#######################################################################
#################### global variables #################################
#######################################################################

my $dbh;
my $dblink;
my $configUrl;

#######################################################################
sub new {      ############ constructor ###############################
#######################################################################
       
	my ($self, %args) = @_;

	$self = {};
	bless $self;

      	$self->{'_database'} = $args{'database'};
	$self->{'_help'}     = defined($args{'help'}) ? 
	                       $args{'help'} : "";
	$self->{'_title'}    = defined($args{'title'}) ? 
	                       $args{'title'} : "Dbuser Curation Page";
	$self->{'_user'}     = defined($args{'user'}) ? $args{'user'} : "";
	$dbh = &ConnectToDatabase($self->database);
    	return $self;
}

sub help { $_[0]->{_help} }
sub database { $_[0]->{_database} }
sub title { $_[0]->{_title} }
sub user { $_[0]->{_user} }

######################################################################
sub DESTROY {   ############ destructor ##############################
######################################################################
    	if (defined $dbh) {
		$dbh->disconnect;
    	}
}

######################################################################
sub start{
######################################################################

    	my ($self) = @_;
	$configUrl = ConfigURLdictyBase->new;
	$dblink = $configUrl->dblink($self->database);
	if (!$self->user) {
	    print "location: ", $configUrl->dictyBaseCGIRoot, "$dblink/curatorLogin\n";
	    print "Content-type: text/html\n\n";
	    exit;
	}
	my ($dbuser, $dbpasswd) = &getUsernamePassword(uc($self->user),
						       $self->database);
	if (!$dbuser || !$dbpasswd) {
	    print "location: ", $configUrl->dictyBaseCGIRoot, "$dblink/curatorLogin\n";
	    print "Content-type: text/html\n\n";
	    exit;
	}
  	if (param('commit')) {
	    $dbh->disconnect;
	    $dbh = &ConnectToDatabase($self->database, $dbuser, $dbpasswd);
	    $self->commitInfo;
	}
	elsif (param('type') =~ /edit/i) {
	    $self->editInfo;
        }
	elsif (param('type') =~ /delete/i) {
	    $self->deleteInfo;
        }
	elsif (param('type') =~ /new/i) {
	    $self->enterInfo;
        }
        else {
	    $self->displayInfo;
        }
}

#######################################################################
sub displayInfo {
#######################################################################
        my ($self) = shift;

	&printStartPage($self->database, $self->title, $self->help);

	my $user = $self->user;

	print p, center(a({-href=>url."?user=$user&type=new"},
			  b("Enter new entry"))),p;
	my $deleteGif = $configUrl->dictyBaseImages."delete.gif";
	my $editGif = $configUrl->dictyBaseImages."edit.gif";
	my @tabRows;
	my $arrayRef = Dbuser->GetDbuserDetail(dbh=>$dbh);
	foreach my $rowRef (@$arrayRef) {
	    my ($userid, $fname, $lname, $status, $email, 
		$dateCreated) = @$rowRef;
	    my $images = a({-href=>url."?user=$user&userid=$userid&type=delete"},
			   img({-src=>"$deleteGif",
				-width=>"20",
				-height=>"20",
				-border=>"0",
				-alt=>'Delete'})).
		         a({-href=>url."?user=$user&userid=$userid&type=edit"},
			   img({-src=>"$editGif",
				-width=>"20",
				-height=>"20",
				-border=>"0",
				-alt=>'Edit'}));
	    
	    my $table = table({-border=>'1',
			       -width=>'750',
			       -cellpadding=>'2',
			       -cellspacing=>'1'},
			      Tr(td({-width=>'50', 
				     -bgcolor=>'#a4abc2'},
				    $images). 
				 td({-width=>'700'},
				    table({-width=>"100%",
					   -border=>'1',
					   -cellspacing=>'1',
					   -cellpadding=>'2'},
					  Tr(td({-width=>'100',
						 -bgcolor=>'#b7d8e4'},
						"USERID").
					     td({-bgcolor=>'#d8d8d8'}, 
						$userid).
					     td({-bgcolor=>'#b7d8e4'},
						"First Name").
					     td({-bgcolor=>'#d8d8d8'},
						$fname).
					     td({-bgcolor=>'#b7d8e4'},
						"Last Name").
					     td({-bgcolor=>'#d8d8d8'},
						$lname).
					     td({-bgcolor=>'#b7d8e4'},
						"Status").
					     td({-bgcolor=>'#d8d8d8'},
						$status)
		                          ).
					  Tr(td({-bgcolor=>'#b7d8e4'},
						"Email").
					     td({-colspan=>'3'},
						$email). 
					     td({-bgcolor=>'#b7d8e4'},
						"Date Created").
					     td({-colspan=>'3',
						 -bgcolor=>'#d8d8d8'},
						$dateCreated)
					  )
				    )
				 )
			      )
			);
	    push(@tabRows, Tr(td($table)));
	    push(@tabRows, Tr(td({-colspan=>'8'},br)));
	}

	print center(table({-border=>0}, @tabRows));

	&printEndPage;
}

#######################################################################
sub enterInfo {
#######################################################################
        my ($self) = shift;

	&printStartPage($self->database, $self->title, $self->help);

        print p, b(font({-size=>'+2'},"Enter the new dbuser entry below.")),p;
		
	print 
	    startform,
	    hidden(-name=>'user',
		   -value=>$self->user),
	    hidden(-name=>'type',
		   -value=>'new');
	$self->printEntryBox;
	print p,
	    submit(-name=>'commit', 
		   -value=>'Submit'),
	    endform;      

	&printEndPage;
}

#######################################################################
sub editInfo {
#######################################################################
        my ($self) = shift;

	&printStartPage($self->database, $self->title, $self->help);

	my $dbuser = Dbuser->new(dbh=>$dbh,
				 userid=>param('userid'));       
	print p, b(font({-size=>'+2'},"Edit the dbuser info below.")),p;

	print 
	    startform,
	    hidden(-name=>'userid', 
		   -value=>param('userid')),
	    hidden(-name=>'user', 
		   -value=>$self->user),
 	    hidden(-name=>'type', 
		   -value=>'edit');
	$self->printEntryBox(param('userid'), $dbuser->first_name,
			     $dbuser->last_name, $dbuser->status, 
			     $dbuser->email);
	$self->printLogBox("Update log comments");
	print submit(-name=>'commit', 
		   -value=>'Submit'),
	      endform, p;   

	&printEndPage;
}


#######################################################################
sub deleteInfo {
#######################################################################
        my ($self) = shift;

	&printStartPage($self->database, $self->title, $self->help);
	
	my $dbuser = Dbuser->new(dbh=>$dbh,
				 userid=>param('userid'));
	print p, b(font({-size=>'+2'},"Click 'Delete' to delete this dbuser entry from database.")), p; 

	print 
	    startform,
	    hidden(-name=>'user', 
		   -value=>$self->user),
	    hidden(-name=>'userid', 
		   -value=>param('userid')),
 	    hidden(-name=>'type', 
		   -value=>'delete');
	$self->printEntryBox(param('userid'), $dbuser->first_name, 
			     $dbuser->last_name, $dbuser->status, 
			     $dbuser->email, "delete");
	$self->printLogBox("Delete log comments");
	print p,
	    submit(-name=>'commit', 
		   -value=>'Delete'),
	    endform;  
	&printEndPage;
}

########################################################################
sub commitInfo {
########################################################################
    my ($self) = shift;
    &printStartPage($self->database, $self->title, $self->help);
    ##################
    if (param('type') =~ /edit/i) {
	$self->DoUpdate;
    }
    elsif (param('type') =~ /delete/i) {
	$self->DoDelete;
    }
    elsif (param('type') =~ /new/i) {
	$self->DoInsert;
    }
    ##################
    print p, b("Return to ".a({-href=>$configUrl->dictyBaseCGIRoot."$dblink/curatorLogin?user=".$self->user}, "dictyBase Curator Central")), br;
    ##################

    ##################
    &printEndPage;
    ##################         
}

#######################################################################
sub DoUpdate {
#######################################################################
    my ($self) = @_;
    
    my $userid = param('userid');
    my $fname = param('fname');
    my $lname = param('lname');
    my $status = param('status');
    my $email = param('email');

    &DeleteUnwantedChar(\$userid);
    &DeleteUnwantedChar(\$fname);
    &DeleteUnwantedChar(\$lname);
    &DeleteUnwantedChar(\$status);
    &DeleteUnwantedChar(\$email);
   
    my $log = param('log');
    &DeleteUnwantedChar(\$log);
        
    my $dbuser = Dbuser->new(dbh=>$dbh,
			     userid=>$userid);
    my $fnameDB = $dbuser->first_name;
    my $lnameDB = $dbuser->last_name;
    my $statusDB = $dbuser->status;
    my $emailDB = $dbuser->email;

    my (@oldVal, @newVal, @colNm);
    if ($fname ne $fnameDB) {
	$dbuser->updateFirst_name($fname);
	push(@oldVal, $fnameDB);
	push(@newVal, $fname);
	push(@colNm, "FIRST_NAME");
    }
    if ($lname ne $lnameDB) {
	$dbuser->updateLast_name($lname);
	push(@oldVal, $lnameDB);
	push(@newVal, $lname);
	push(@colNm, "LAST_NAME");
    }
    if ($status ne $statusDB) {
	$dbuser->updateStatus($status);
	push(@oldVal, $statusDB);
	push(@newVal, $status);
	push(@colNm, "STATUS");
    }
    if ($email ne $emailDB) {
	$dbuser->updateEmail($email);
	push(@oldVal, $emailDB);
	push(@newVal, $email);
	push(@colNm, "EMAIL");
    }
    if (@colNm) {
	eval { $dbuser->enterUpdates; };
	if ($@) {
	    print "An error occurred: $@", br;
	    $dbh->rollback;
	}
	else {
	    $dbh->commit;
	    print "The dbuser table has been update.", p;
	    if ($log) {
		for (my $i = 0; $i <= $#colNm; $i++) {
		    my $ulog = Update_log->new(dbh=>$dbh,
					       tab_name=>'DBUSER',
					       col_name=>$colNm[$i],
					       primary_key=>$userid,
					       old_value=>$oldVal[$i],
					       new_value=>$newVal[$i]);
		    $ulog->updateDescription($log);
		    eval { $ulog->enterUpdates($self->user);};
		    if ($@) {
			print "An error occurred when updating update_log table.$@", br;
			$dbh->rollback;
		    }
		    else {
			$dbh->commit;
			print "The update log comment for updating $colNm[$i] has been inserted into update_log table.",p;
		    }
		}
	    }
	}
    }
}

#######################################################################
sub DoDelete {
#######################################################################
    my ($self) = @_;
    my $userid = param('userid');
    $userid = "\U$userid";
    my $log = param('log');
    &DeleteUnwantedChar(\$log);
    ##################

    my $dbuser = Dbuser->new(dbh=>$dbh,
			     userid=>$userid);

    
    if (!$dbuser) {

	print "The userid '$userid' is not found in database.",p;

	return;

    }


    my $deletedRow = $dbuser->getRow;
    
    eval { $dbuser->delete; };

    if ($@) {
	print "An error occurred: $@",br;
	$dbh->rollback;
    }
    else {
	$dbh->commit;
        print "The dbuser entry for userid = $userid has been deleted from dbuser table.", p;
	if ($log) {
	    my $dlog = Delete_log->new(dbh=>$dbh,
				       tab_name=>'DBUSER',
				       deleted_row=>$deletedRow);

	    if (!$dlog) {

		print "The deletedRow = '$deletedRow' is not found in delete_log table.",p;
		return;

	    }
	    
	    $dlog->updateDescription($log);
	    eval { $dlog->enterUpdates($self->user); };
	    if ($@) {
		print "An error occurred when updating delete_log table:$@",br;
		$dbh->rollback;
	    }
	    else {
		$dbh->commit;
		print "The delete log has been inserted into delete_log table.",br;
	    }
	}
    }
}

#######################################################################
sub DoInsert {
#######################################################################
    my ($self) = @_;
    
    my $fname = param('fname');
    my $lname = param('lname');
    my $status = param('status');
    my $email = param('email');
    my $userid = param('userid');

    DeleteUnwantedChar(\$fname);
    DeleteUnwantedChar(\$lname);
    DeleteUnwantedChar(\$status);
    DeleteUnwantedChar(\$email);
    DeleteUnwantedChar(\$userid);
    $userid = "\U$userid";

    eval {
	Dbuser->Insert(dbh=>$dbh,
		       binds=>{userid=>$userid,
			       first_name=>$fname,
			       last_name=>$lname,
			       status=>$status,
			       email=>$email});
    };
    if ($@) {
	print "An error occurred: $@",br;
	$dbh->rollback;
    }
    else {
	$dbh->commit;
        print "The new entry has been inserted into dbuser table.", p;
    }
} 

#######################################################################
sub printEntryBox{
########################################################################
    my ($self, $userid, $fname, $lname, $status, $email, $delete) = @_;
    my $rows;
    if ($delete) {
	$rows = Tr({-align=>'left'},
		   th({-bgcolor=>'#a4abc2'}, "Userid").
		   td(font({-size=>"+1"}, $userid))).
		Tr({-align=>'left'},
		   th({-bgcolor=>'#a4abc2'}, "First Name").
		   td(font({-size=>"+1"}, $fname))).
	        Tr({-align=>'left'},
		   th({-bgcolor=>'#a4abc2'}, "Last Name").
		   td(font({-size=>"+1"}, $lname))).
		Tr({-align=>'left'},
		   th({-bgcolor=>'#a4abc2'}, "Status").
		   td(font({-size=>"+1"}, $status))).
		Tr({-align=>'left'},
		   th({-bgcolor=>'#a4abc2'}, "Email").
		   td(font({-size=>"+1"}, $email)));		     
    }
    else {
	$rows = Tr({-align=>'left'},
		   th({-bgcolor=>'#a4abc2'}, "Userid").
		   td(start_form().
		      textfield(-name=>'userid',
				-value=>"$userid",
				-size=>60))).
	        Tr({-align=>'left'},
		   th({-bgcolor=>'#a4abc2'}, "First Name").
		   td(start_form().
		      textfield(-name=>'fname',
				-value=>"$fname",
				-size=>60))).
	        Tr({-align=>'left'},
		   th({-bgcolor=>'#a4abc2'}, "Last Name").
		   td(textfield(-name=>'lname',
			       -value=>"$lname",
			       -size=>60))).
		Tr({-align=>'left'},
		   th({-bgcolor=>'#a4abc2'}, "Status").
		   td(popup_menu(-name=>'status',
				 -value=>['Current', 'Former'],
				 -default=>$status))).
		Tr({-align=>'left'},
		   th({-bgcolor=>'#a4abc2'}, "Email").
		   td(textfield(-name=>'email',
			       -value=>"$email",
				-size=>60)));
    }
    print table({-width=>650,
		 -border=>1,
		 -cellspacing=>1,
		 -cellpadding=>"+3",
		 -bordercolor=>'#BBBBEE',
		 -bordercolordark=>'#0000FF',
		 -bordercolorlight=>'#FFFFFF'},
 		$rows
	);

}

######################################################################
sub printLogBox {
######################################################################
    my ($self, $text) = @_;

    print table({-width=>650,
		 -border=>1,
		 -cellspacing=>1,
		 -cellpadding=>'+3',
		 -bordercolor=>'#BBBBEE',
		 -bordercolordark=>'#0000FF',
		 -bordercolorlight=>"#FFFFFF"},
   		Tr({-align=>'center'},
  		    th({-colspan=>4,
			-bgcolor=>"#CCCCCC"},
		       $text)),	
 		Tr({-align=>'left'},
 		    td({-colspan=>4},
		       start_form,
 		       textarea(-name=>'log',
				-rows=>3,
				-columns=>65)))
 	);
}

########################################################################
sub err_report {
########################################################################
    my ($self, $err) = @_;
    
    &printStartPage($self->database, $self->title, $self->help);
	
    print b($err);
    
    &printEndPage;
    $dbh->disconnect;
    exit;
}

########################################################################
1;
########################################################################



















