package WebBack::Scheduler;

use strict;
use Digest::MD5 qw(md5 md5_base64);

BEGIN {
   use Exporter ();
   our ( $VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS );

   $VERSION 	= 0.05;
   @ISA		= qw(Exporter);
   @EXPORT	= ( );
   %EXPORT_TAGS = ( );

   @EXPORT_OK   = ( );
}

our @EXPORT_OK;

sub new
{
	my $type = shift;
	my $request = shift;
	my $conf_dir = shift;

	my $self = bless { @_ };

	$self->{URL} = $request->url( -relative => 1 );
	$self->{mode} = $request->param( "mode" );
	$self->{conf_dir} = $conf_dir;

	return $self;
}

sub update
{
	my $self = shift;
	my $request = shift;

	if ( defined $request->param('data_loaded') && 
             $request->param('data_loaded') eq "TRUE" ) {
		# Update data in memory, don't save.
		my $counter = 1;
		my @newsched = ();
		while ( defined( $request->param("${counter}_exists") ) )
		{
			if ( defined $request->param("${counter}_delete") &&
                             $request->param("${counter}_delete") ne "TRUE" )
			{
				my %temp = ();
				if ( defined $request->param("${counter}_active") && 
			     	     $request->param("${counter}_active") eq "on" ) {
					$temp{active} = 1;
				} else {
					$temp{active} = 0;
				}

				$temp{hour} = $request->param("${counter}_hour");
				$temp{minute} = $request->param("${counter}_minute");
				$temp{day} = $request->param("${counter}_day");
				$temp{month} = $request->param("${counter}_month");
				$temp{dayofweek} = $request->param("${counter}_dayofweek");
				$temp{fileset} = $request->param("${counter}_fileset");
				$temp{device} = $request->param("${counter}_device");
	
				push @newsched, \%temp;
			}
			$counter += 1;
		}

		# Check for a new schedule, and pull the information in if need be.
		if ( defined( $request->param("new_add") ) && $request->param("new_add") eq "TRUE" )
		{
			my %temp = ();
			if ( defined $request->param("new_active") && 
		     	     $request->param("new_active") eq "on" ) {
				$temp{active} = 1;
			} else {
				$temp{active} = 0;
			}

			$temp{hour} = $request->param("new_hour");
			$temp{minute} = $request->param("new_minute");
			$temp{day} = $request->param("new_day");
			$temp{month} = $request->param("new_month");
			$temp{dayofweek} = $request->param("new_dayofweek");
			$temp{fileset} = $request->param("new_fileset");
			$temp{device} = $request->param("new_device");

			push @newsched, \%temp;
		}

		$self->{schedules} = \@newsched;
			

	} else {
		# Load data from disk file.
		my $sched_file = $self->{conf_dir} . "/scheduled";

		if ( ! -f "$sched_file" ) {
			my @empty = ();
			$self->{schedules} = \@empty;
		} else {
			my @empty = ();
			open SCHEDULED, "<$sched_file";
			while (<SCHEDULED>)
			{
				my $line;
				my $active;

				if ( m/^#/ ) 
				{ 	
					$line = $_;
					$line =~ s/^#\s*//;
					$active = 0;
				} else {
					$line = $_;
					$active = 1;
				}

				m/([\d\-\,\*]+)\s+
				  ([\d\-\,\*]+)\s+
				  ([\d\-\,\*]+)\s+
				  ([\d\-\,\*]+)\s+
				  ([\d\-\,\*]+)\s+
				  ([\w]+)\s+
				  ([\w]+)/x =~ $line;
				
				if ( defined $1 )
				{
					my %temp = ( active => $active, 
						     minute => "$1", 
						     hour => "$2", 
						     day => "$3", 
						     month => "$4",
						     dayofweek => "$5", 
						     fileset => $6, 
						     device => $7 );

					push @empty, \%temp;
				}
			}
			close SCHEDULED;

			$self->{schedules} = \@empty;
		}
	}
}


sub show
{
	my $self = shift;
	my $colors = shift;

	print "<HTML>\n";
	print "<HEAD><TITLE>Backup Scheduler</TITLE></HEAD>\n";
	print "<BODY BGCOLOR=\"" . $colors->{bgcolor} . "\" ";
	print       "TEXT=\"" . $colors->{text} . "\" ";
	print       "LINK=\"" . $colors->{link} . "\" ";
	print       "ALINK=\"" . $colors->{alink} . "\" ";
	print       "VLINK=\"" . $colors->{vlink} . "\">\n";
	print "<H2>Backup Scheduler</H2>";
	print "<FORM ACTION=\"" . $self->{URL} . "\" METHOD=POST NAME=\"dir_tree\">\n";
	print "<INPUT TYPE=\"HIDDEN\" NAME=\"mode\" VALUE=\"" . $self->{mode} . "\">\n";
	print "<INPUT TYPE=\"HIDDEN\" NAME=\"data_loaded\" VALUE=\"TRUE\">\n";
	print "<CENTER>";

	print "<TABLE WIDTH=95% CELLSPACING=2 BORDER=0 CELLPADDING=3>\n";
	print "<TR>\n";
	print "<TH ROWSPAN=2 BGCOLOR=\"#FFFFFF\">Add/Delete</TH>\n";
	print "<TH BGCOLOR=\"#FFFFFF\">Active?</TH><TH BGCOLOR=\"#FFFFFF\">Hour</TH><TH BGCOLOR=\"#FFFFFF\">Minute</TH>\n";
	print "<TH ROWSPAN=2 BGCOLOR=\"#FFFFFF\" VALIGN=\"CENTER\">FileSet<BR>Backup Device</TH>\n";
	print "</TR>\n";
	print "<TR>\n";
	print "<TH BGCOLOR=\"#FFFFFF\">Day of the Month</TH>\n";
	print "<TH BGCOLOR=\"#FFFFFF\">Month</TH>\n";
	print "<TH BGCOLOR=\"#FFFFFF\">Day of the Week</TH>\n";
	print "</TR>\n";

	my $aref = $self->{schedules};
	my @scheduled = @$aref;	
	
	my $counter = 1;

	for my $scheduled ( @scheduled )
	{
		print "<TR>\n";
		print "<TD ALIGN=CENTER ROWSPAN=2 BGCOLOR=\"#FFFFAA\">Delete<BR><INPUT TYPE=CHECKBOX NAME=\"${counter}_delete\" VALUE=\"TRUE\"></TD>\n";
		print "<TD ALIGN=CENTER BGCOLOR=\"#FFFFAA\">\n";
		print "<INPUT TYPE=HIDDEN NAME=\"${counter}_exists\" VALUE=\"TRUE\">\n";
		print "<INPUT TYPE=CHECKBOX NAME=\"${counter}_active\"";
		if ( $scheduled->{active} == 1) { print " CHECKED" }
		print "></TD>\n";
		print "<TD ALIGN=CENTER BGCOLOR=\"#FFFFAA\">\n";
		print "<INPUT TYPE=TEXT SIZE=5 MAXLENGTH=20 NAME=\"${counter}_hour\" VALUE=\"" . $scheduled->{hour} . "\">";
		print "</TD>";
		print "<TD ALIGN=CENTER BGCOLOR=\"#FFFFAA\">\n";
		print "<INPUT TYPE=TEXT SIZE=5 MAXLENGTH=20 NAME=\"${counter}_minute\" VALUE=\"" . $scheduled->{minute} . "\">\n";	
		print "</TD>\n";
		print "<TD ROWSPAN=2 BGCOLOR=\"#FFFFAA\">FileSet: \n";
		$self->show_fileset_selector( "${counter}_fileset", $scheduled->{fileset} );
		print "<BR>\n";
		print "Backup Device: \n";
		$self->show_device_selector( "${counter}_fileset", $scheduled->{device} );
		print "</TD>\n";
		print "</TR>\n";
		print "<TR>\n";
		print "<TD ALIGN=CENTER BGCOLOR=\"#FFFFAA\"><INPUT TYPE=TEXT SIZE=5 MAXLENGTH=20 NAME=\"${counter}_day\" VALUE=\"" . $scheduled->{day} . "\"></TD>\n";
		print "<TD ALIGN=CENTER BGCOLOR=\"#FFFFAA\"><INPUT TYPE=TEXT SIZE=5 MAXLENGTH=20 NAME=\"${counter}_month\" VALUE=\"" . $scheduled->{month} . "\"></TD>\n";
		print "<TD ALIGN=CENTER BGCOLOR=\"#FFFFAA\"><INPUT TYPE=TEXT SIZE=5 MAXLENGTH=20 NAME=\"${counter}_dayofweek\" VALUE=\"" . $scheduled->{dayofweek} . "\"></TD>\n";
		print "</TR>\n";

		$counter += 1;
	}

	print "<TR>\n";
	print "<TD ALIGN=CENTER ROWSPAN=2 BGCOLOR=\"#FFBB66\">Add<BR><INPUT TYPE=CHECKBOX NAME=\"new_add\"></TD>\n";
	print "<TD ALIGN=CENTER BGCOLOR=\"#FFBB66\"><INPUT TYPE=CHECKBOX NAME=\"new_active\"></TD>\n";
	print "<TD ALIGN=CENTER BGCOLOR=\"#FFBB66\"><INPUT TYPE=TEXT SIZE=5 MAXLENGTH=20 NAME=\"new_hour\"></TD>";
	print "<TD ALIGN=CENTER BGCOLOR=\"#FFBB66\"><INPUT TYPE=TEXT SIZE=5 MAXLENGTH=20 NAME=\"new_minute\"></TD>";
	print "<TD ROWSPAN=2 BGCOLOR=\"#FFBB66\">FileSet: ";
	$self->show_fileset_selector("new_fileset");
	print "<BR>\n";
	print "Backup Device: \n";
	$self->show_device_selector("new_device");
	print "</TD>\n";
	print "</TR>\n";
	print "<TR>\n";
	print "<TD ALIGN=CENTER BGCOLOR=\"#FFBB66\"><INPUT TYPE=TEXT SIZE=5 MAXLENGTH=20 NAME=\"new_day\"></TD>";
	print "<TD ALIGN=CENTER BGCOLOR=\"#FFBB66\"><INPUT TYPE=TEXT SIZE=5 MAXLENGTH=20 NAME=\"new_month\"></TD>";
	print "<TD ALIGN=CENTER BGCOLOR=\"#FFBB66\"><INPUT TYPE=TEXT SIZE=5 MAXLENGTH=20 NAME=\"new_dayofweek\"></TD>";
	print "</TR>\n";
	print "<TR>\n";
	print "<TD COLSPAN=5 BGCOLOR=\"#FF9900\" ALIGN=CENTER VALIGN=CENTER>\n";
	print "<BR>\n";
	print "<INPUT TYPE=RESET VALUE=\"Reset\">\n";
	print "<INPUT TYPE=SUBMIT VALUE=\"Update\">\n";
	print "<INPUT TYPE=SUBMIT VALUE=\"Commit\">\n";
	print "<BR><BR>\n";
	print "</TD>\n";
	print "</TR>\n";
	print "</TABLE>";
	print "</CENTER>";
	print "</FORM>";

	return;
}

sub show_fileset_selector
{
	my $self = shift; 
	my $name = shift;
	my $default = shift;

	my $fileset_dir = $self->{conf_dir} . "/filesets/";

	my @filesets = ();

	if ( -d $fileset_dir ) 
	{
		opendir FILESETS, $fileset_dir;
		@filesets = grep !/^\./, readdir FILESETS;
		closedir FILESETS;
	}

	if ( scalar(@filesets) == 0 )
	{ push @filesets, "No Filesets Defined"; }

	print "<SELECT NAME=\"$name\">\n";
	for my $fileset ( @filesets ) 
	{
		if ( defined $default && $fileset eq $default ) 
		{
			print "<OPTION SELECTED VALUE=\"$fileset\">$fileset</OPTION>\n";
		} else {
			print "<OPTION VALUE=\"$fileset\">$fileset</OPTION>\n";
		}
	}
	print "</SELECT>\n";

	return;
}

sub show_device_selector
{
	my $self = shift; 
	my $name = shift;
	my $default = shift;

	my $device_dir = $self->{conf_dir} . "/devices/";

	my @devices = ();

	if ( -d $device_dir ) 
	{
		opendir DEVICES, $device_dir;
		@devices = grep !/^\./, readdir DEVICES;
		closedir DEVICES;
	}

	if ( scalar(@devices) == 0 )
	{ push @devices, "No Devices Defined"; }

	print "<SELECT NAME=\"$name\">\n";
	for my $device ( @devices ) {
		if ( defined $default ) {
			if ( $device eq $default ) {
				print "<OPTION SELECTED VALUE=\"$device\">$device</OPTION>\n";
			} else {
				print "<OPTION VALUE=\"$device\">$device</OPTION>\n";
			}
		} else {
			print "<OPTION VALUE=\"$device\">$device</OPTION>\n";
		}
	}
	print "</SELECT>\n";

	return;
}
	
1;

