#!/usr/bin/perl

use strict;
## $Id$


################################################################
#  Copyright @1995-1998 by Michael E. Gage, Arnold K. Pizer and
#  WeBWorK at the University of Rochester. All rights reserved.
################################################################

use lib '/ww/webwork/development/'; # mainWeBWorKDirectory;

## l2hPrecreateSet.pl
##
## pre-creates latex2html output for each student for a problem set
## so that WeBWorK doesn't have to run latex2html in processProblems

## NOTE: problem set has to be built before precreating...

## this is called with arguments classID setdefinitionfile...
## e.g. l2hPrecreateSet.pl demoCourse set1.def

use CGI;
use Global;
use TimeLocal;
use PGtranslator;
my($courseID, $fileName, $lowerLimit, $upperLimit) = @ARGV;




if( (@ARGV < 2) or (@ARGV > 4) ) {
	print "\nSyntax is: l2hPrecreateSet.pl course_name set_definition_filename    or\n";
	print "           l2hPrecreateSet.pl course_name set_definition_filename lowerLimit   or\n";
	print "           l2hPrecreateSet.pl course_name set_definition_filename lowerLimit upperLimit\n\n";
	print "       (e.g. l2hPrecreateSet.pl demoCourse set1.def    or\n";
	print "       (e.g. l2hPrecreateSet.pl demoCourse set1.def  30000  or\n";
	print "       (e.g. l2hPrecreateSet.pl demoCourse set1.def  30000   60000\n\n";

	print "Problems are pre created for all psvn's between lower and upper limits if the limits\n";
	print "  are given.\n\n";
	exit(0);
  }

&Global::getCourseEnvironment($courseID);

    my $databaseDirectory       = getCourseDatabaseDirectory();
    my $htmlDirectory           = getCourseHtmlDirectory();
    my $htmlURL                 = getCourseHtmlURL();
    my $scriptDirectory         = getWebworkScriptDirectory();
    my $templateDirectory       = getCourseTemplateDirectory();
    my $courseScriptsDirectory  = getCourseScriptsDirectory();
    my $tempDirectory           = getCourseTempDirectory();

require "${courseScriptsDirectory}$Global::displayMacros_pl";
require "${scriptDirectory}$Global::DBglue_pl";
require "${scriptDirectory}$Global::FILE_pl";
require "${scriptDirectory}$Global::HTMLglue_pl";

####################################################################
# load the modules to be used in PGtranslator
	require "${courseScriptsDirectory}PG_module_list.pl";
####################################################################

$fileName = ${templateDirectory} . $fileName;

my  $starttime = time;
my  ($name);
my  ($setNumber,$setHeaderFileName,$probHeaderFileName,$dueDate,$openDate,$answerDate,$problemListref,$problemValueListref,$problemAttemptLimitListref)
        = &readSetDef($fileName);
my  @problemList = @$problemListref;
my  @problemValueList = @$problemValueListref;
my  @problemAttemptLimitList = @$problemAttemptLimitListref;


my $numProbs=0;
foreach $name (@problemList)
    {$numProbs++;}

my @setProbSetKeys = &getAllProbSetKeysForSet($setNumber);
#sort the ProbSetKeys to make it easier to keep track of what's happening
@setProbSetKeys = sort {$a <=> $b} @setProbSetKeys;

my $mode = 'Latex2HTML';
my ($ii,$psvn);
my @saveSubmittedAnswerList = ();
my $seed;
foreach $psvn (@setProbSetKeys) {
	next if ((defined $lowerLimit) and ($psvn < $lowerLimit));
	next if ((defined $upperLimit) and ($psvn > $upperLimit));
	&attachProbSetRecord($psvn);
    	print "In foreach: key = $psvn\n";
    	for($ii=1; $ii<=$numProbs; $ii++) {
        	print "In for key = $psvn .... i = $ii\n";



    		my $source;
        	my $probFileName    =   &getProblemFileName($ii,$psvn);;
    		if (-e "${templateDirectory}$probFileName" ) {
				unless (-r "${templateDirectory}$probFileName") {
					wwerror($0, "Can't read ${templateDirectory}$probFileName");
		    	}
		    	open(PROB,"<${templateDirectory}$probFileName");
		    	$source = join("",<PROB>);
		    	close(PROB);
	    	}
		    ###############################################
		    # Create problem text
		    ###############################################
		    my %envir=defineProblemEnvir($mode,$ii,$psvn,$courseID,\@saveSubmittedAnswerList);

			my $pt = new PGtranslator;  #pt stands for problem translator;
			$pt->environment(\%envir);
			$pt->initialize();
			$pt-> set_mask();
			# $pt -> evaluate_modules(qw( Exporter DynaLoader GD WWPlot Fun Circle Label PGrandom Units ) );
			# The modules to be loaded are now defined in PG_modules_list.pl
			$pt->source_string($source);
	    	$pt -> unrestricted_load("${courseScriptsDirectory}PG.pl");
	    	$pt -> unrestricted_load("${courseScriptsDirectory}dangerousMacros.pl");
	    	$pt ->translate();
		    &createDisplayedProblem($setNumber,$ii,$psvn,$pt->ra_text(), $pt->rh_flags());

            undef($pt);
	        ## remove any links to gifs. These are not needed and when created by a script run from
	        ## the command, they are invalid if the webserver is in a chroot enviroment
	        unlink(<$tempDirectory/gif/*${psvn}-set${setNumber}-prob${ii}-*>);
     }
}




my $endtime = time;
my $totaltime = ($endtime - $starttime)/60;

print "\n\nThis took $totaltime minutes to precreate $fileName \n\n";



sub defineProblemEnvir {
    my ($mode,$probNum,$psvn,$courseName,$refSubmittedAnswers)      =   @_;
    my %envir=();
    ##how to put an array submittedAnswers in a hash??
    $envir{'refSubmittedAnswers'}  	=   $refSubmittedAnswers if defined($refSubmittedAnswers);
    $envir{'psvnNumber'}	   		=   $psvn;
    $envir{'psvn'}		   			=   $psvn;
    $envir{'studentName'}	   		=   &getStudentName($psvn);
	$envir{'studentLogin'}	    	=	&getStudentLogin($psvn);
	$envir{'sectionName'}	    	=	&getClassSection($psvn);
	$envir{'sectionNumber'}	    	=	&getClassSection($psvn);
	$envir{'recitationName'}	    =	&getClassRecitation($psvn);
	$envir{'recitationNumber'}	    =	&getClassRecitation($psvn);
	$envir{'setNumber'}	    		=	&getSetNumber($psvn);
	$envir{'questionNumber'}      	=	$probNum;
	$envir{'probNum'} 	    		=	$probNum;
	$envir{'openDate'}	    		=	&getOpenDate($psvn);
	$envir{'formattedOpenDate'}    	=	&formatDateAndTime(&getOpenDate($psvn));
	$envir{'dueDate'} 	    		=	&getDueDate($psvn);
	$envir{'formattedDueDate'}     	=	&formatDateAndTime(&getDueDate($psvn));
	$envir{'answerDate'}	    	=	&getAnswerDate($psvn);
	$envir{'formattedAnswerDate'}  	=	&formatDateAndTime(&getAnswerDate($psvn));
	$envir{'problemValue'}	    	=	&getProblemValue($probNum,$psvn);
	$envir{'fileName'}	    		=	&getProblemFileName($probNum,$psvn);
	$envir{'probFileName'}	    	=	&getProblemFileName($probNum,$psvn );
	$envir{'displayMode'}	    	=	$mode;
	$envir{'languageMode'}	    	=	$mode;
	$envir{'outputMode'}	    	=	$mode;
	$envir{'courseName'}	    	=	$courseName;
	$envir{'sessionKey'}	    	=	( defined($main::in{'key'}) ) ?$main::in{'key'} : " ";


	# initialize constants for PGanswermacros.pl
	$envir{'numRelPercentTolDefault'} 	=     getNumRelPercentTolDefault();
	$envir{'numZeroLevelDefault'}		=     getNumZeroLevelDefault();
	$envir{'numZeroLevelTolDefault'} 	=     getNumZeroLevelTolDefault();
	$envir{'numAbsTolDefault'} 			=     getNumAbsTolDefault();
	$envir{'numFormatDefault'}			=     getNumFormatDefault();
	$envir{'functRelPercentTolDefault'} =     getFunctRelPercentTolDefault();
	$envir{'functZeroLevelDefault'} 	=     getFunctZeroLevelDefault();
	$envir{'functZeroLevelTolDefault'} 	=     getFunctZeroLevelTolDefault();
	$envir{'functAbsTolDefault'} 		=     getFunctAbsTolDefault();
	$envir{'functNumOfPoints'} 			=     getFunctNumOfPoints();
	$envir{'functVarDefault'} 			=     getFunctVarDefault();
	$envir{'functLLimitDefault'} 		=     getFunctLLimitDefault();
	$envir{'functULimitDefault'} 		=     getFunctULimitDefault();
	$envir{'functMaxConstantOfIntegration'} = getFunctMaxConstantOfIntegration();
	$envir{'numOfAttempts'}             =     undef;

	# defining directorys and URLs
	$envir{'templateDirectory'}   		=	&getCourseTemplateDirectory();
	$envir{'classDirectory'}   			=	$Global::classDirectory;
	$envir{'cgiDirectory'}   			=	$Global::cgiDirectory;
	$envir{'cgiURL'}                    =   getWebworkCgiURL();
	$envir{'macroDirectory'}   			=	getCourseMacroDirectory();
	$envir{'courseScriptsDirectory'}   	=	getCourseScriptsDirectory();
	$envir{'htmlDirectory'}             =   getCourseHtmlDirectory();
	$envir{'htmlURL'}   				=	getCourseHtmlURL();
	$envir{'tempDirectory'}             =   getCourseTempDirectory();
	$envir{'tempURL'}                   =   getCourseTempURL();
	$envir{'scriptDirectory'}   		=	$Global::scriptDirectory;
	$envir{'webworkDocsURL'}   			=	$Global::webworkDocsURL;

	$envir{'inputs_ref'}        = {user => 'practice1',course => 'demoCourse', key => ' '};
		# no inputs when in this mode
	$seed	= &getProblemSeed($probNum, $psvn);
	$seed	= 0 unless defined($seed);

	$envir{'problemSeed'}	   	=   $seed if defined($seed);

	my $k;
	foreach $k (keys %Global::PG_environment ) {
		$envir{$k} = $Global::PG_environment{$k};
	}
	%envir;
}
