#!/usr/local/bin/perl



## This file is profDownloadScoringFiles.pl
## It provides access to utilities for downloading scoring files
##

####################################################################
# Copyright @ 1995-1998 University of Rochester
# All Rights Reserved
####################################################################

use lib '/ww/webwork/gage_system/webwork/system/lib/'; # mainWeBWorKDirectory

use CGI qw(:standard);
use Global;
use Auth;
use strict;

# begin Timing code
use Benchmark;
my $beginTime = new Benchmark;
# end Timing code

&CGI::ReadParse;
my %inputs =%main::in;

#my @inarray = %inputs;
#print "inputs are @inarray";

# get information from CGI inputs  (see also below for additional information)

my $Course 			= $inputs{'course'};
my $User 			= $inputs{'user'};
my $Session_key 	= $inputs{'key'};

# verify that information has been received
unless($Course && $User && $Session_key) {
    &Global::error("Script Error","The script profLogin.pl did not receive the proper input data.","","");
    die "The script profLogin.pl did not receive the proper input data.";
}

# establish environment for this script

&Global::getCourseEnvironment($inputs{'course'});


my $cgiURL   				= getWebworkCgiURL;
my $databaseDirectory 		= getCourseDatabaseDirectory;
my $htmlURL       			= getCourseHtmlURL;
my $scriptDirectory   		= getWebworkScriptDirectory;
my $scoringDirectory        = getCourseScoringDirectory;
my $dat                     = getDat; 
my $dd                      = getDirDelim;

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

# log access
&Global::log_info('', query_string);


my $permissionsFile = &Global::getCoursePermissionsFile($inputs{'course'});
my $permissions = &get_permissions($inputs{'user'}, $permissionsFile);
my $keyFile = &Global::getCourseKeyFile($inputs{'course'});

#verify session key
&verify_key($inputs{'user'}, $inputs{'key'}, $keyFile, $inputs{'course'});
		
# verify permissions are correct
if ($permissions != $Global::instructor_permissions ) {
    print "permissions = $permissions instructor_permissions = $Global::instructor_permissions\n";
    print &html_NO_PERMISSION;
    exit(0);
}

#&printEnvVars('html_top','');  ## printout top of html page and ENV VAR's
#print "\ninputs are @array\n"; ## print inputs




# get the rest of the information from the submitted form

my $format          = $inputs{'format'};
my $totalsFile      = $inputs{'totalsFile'};
my $scrFiles        = $inputs{'scrFiles'};
my $fulFiles        = $inputs{'fulFiles'};			
my $allFiles        = $inputs{'allFiles'};
my $download        = $inputs{'download'}; 
my $fileName        = $inputs{'fileName'};

$totalsFile      = 0 unless defined $totalsFile;
$scrFiles        = 0 unless defined $scrFiles;    
$fulFiles        = 0 unless defined $fulFiles;    		
$allFiles        = 0 unless defined $allFiles;    

## if totals file is the only one selected, download it immediately
if ($totalsFile == 1  and  $scrFiles == 0  and  $fulFiles == 0  and  $allFiles == 0) {
    $fileName = "${scoringDirectory}${Course}_totals.csv"; 
   unless (-r $fileName) {
        &Global::error("Error:profDownloadScoringFiles.pl","The file $fileName is not readable by the webserver","","");
    }
    &downloadFile($format, $fileName);
    exit;
}

if ($download == 1) {
    unless ($fileName ne '') {&selectionError();}
    $fileName = "${scoringDirectory}$fileName";
    unless (-r $fileName) {
        &Global::error("Error:profDownloadScoringFiles.pl","The file $fileName is not readable by the webserver","","");
    }  
    &downloadFile($format, $fileName);
    exit;
}

# print HTML text
print &htmlTOP("Download Scoring Files");


# print navigation buttons
print qq!
<A HREF="${cgiURL}profLogin.pl?user=$inputs{'user'}&key=$inputs{'key'}&course=$inputs{'course'}">
<IMG SRC="${Global::upImgUrl}" align="right" BORDER=1 ALT="[Up]"></A><p>
!;

print <<EOF;
<h3 align="left">Download (or view) scoring files for $Course</h3> <p>
EOF


print <<EOF;
<P>
<HR NOSHADE>
<H4 ALIGN=LEFT>
Select files:
</H4>

		<FORM METHOD = "POST" ACTION= "${cgiURL}profDownloadScoringFiles.pl">
         <INPUT TYPE="SUBMIT" VALUE="Download or View file">

EOF

 ## find the available files
 
opendir SCORINGDIR, $scoringDirectory or &Global::error("Error:profDownloadScoringFiles.pl","Can't open directory $scoringDirectory","","");
my @allFiles = grep !/^\./, readdir SCORINGDIR;        
closedir  SCORINGDIR;

    ## sort the files
    
my @totalsFiles = grep /${Course}_totals\.csv$/,@allFiles;
my @scrFiles =  grep /scr\.csv$/,@allFiles;
my @fulFiles =  grep /ful\.csv$/,@allFiles; 
my @remainingFiles = grep !/${Course}_totals\.csv$/,@allFiles;
@remainingFiles = grep !/scr\.csv$/,,@remainingFiles; 
@remainingFiles = grep !/ful\.csv$/,,@remainingFiles; 
my  @sortedNames = ();
if ($allFiles) {
    @totalsFiles = sort @totalsFiles;
    @scrFiles = sort @scrFiles;
    @fulFiles = sort @fulFiles;
    @remainingFiles = sort @remainingFiles;
    @sortedNames = (@totalsFiles,@scrFiles,@fulFiles,@remainingFiles);
} 
else {
    if ($totalsFile) {
        @totalsFiles = sort @totalsFiles;
        @sortedNames = (@sortedNames,@totalsFiles);
    } 
    if ($scrFiles) {
        @scrFiles = sort @scrFiles;
        @sortedNames = (@sortedNames, @scrFiles);
    } 
    if ($fulFiles) {
        @fulFiles = sort @fulFiles;
        @sortedNames = (@sortedNames, @fulFiles);
    } 
}            
    ## print list of files
  
print qq! <SELECT Name="fileName" >\n!; 
my ($ind);
for $ind (@sortedNames) {      
	print "<OPTION VALUE = \"$ind\">$ind\n";
}
    print qq!</SELECT>\n!;

 ## resume printing the rest of the form

print <<EOF;
         <INPUT TYPE="HIDDEN" NAME="user" VALUE="$inputs{'user'}">
         <INPUT TYPE="HIDDEN" NAME="key" VALUE="$inputs{'key'}">
         <INPUT TYPE="HIDDEN" NAME="course" VALUE="$inputs{'course'}">  
         <INPUT TYPE="HIDDEN" NAME="format" VALUE="$inputs{'format'}"> 
         <INPUT TYPE="HIDDEN" NAME="download" VALUE= 1 >        
         </FORM>     
EOF



print &htmlBOTTOM("profDownloadScoringFiles.pl", \%inputs);

# begin Timing code
my $endTime = new Benchmark;
&Global::logTimingInfo($beginTime,$endTime,"profScoring.pl",$inputs{'course'},$inputs{'user'});
# end Timing code
exit;

sub selectionError {
  print"content-type:\n\n<H2>Error:  You must make a selection!</H2>\n";
  print "<FORM METHOD=POST ACTION=\"${cgiURL}profDownloadScoringFiles.pl\"><P>";
  print &sessionKeyInputs(\%inputs);
print <<"ENDOFHTML";
<INPUT TYPE=SUBMIT VALUE="Return to Download Scoring Files Page">
</FORM>
ENDOFHTML
  print &htmlBOTTOM("profDownloadScoringFiles.pl", \%inputs);
  exit;
}

sub downloadFile {
    my ($format, $fileName) = @_;
    my (@stringArray, $string, $contentType);
    
    my $shortFileName   =   $fileName;
    if ($shortFileName  =~  m|$dd|)  {
        $shortFileName  =~  m|$dd([^$dd]*)$|;  ## extract filename from full path name
        $shortFileName  =   $1;
    }    
    $shortFileName      =~  s|\..*||;      ## remove extension    
    
    
    if ($format eq 'csv') {
        $contentType = 'content-type: webwork/csv';
        open (SCOREFILE, "$fileName");
        @stringArray = <SCOREFILE>;
        close (SCOREFILE);
        $string = join '', @stringArray;
        
        print "Content-disposition: attachment; filename= \"${shortFileName}.csv\"\n";       
        print "$contentType\n\n";
        print "$string";
    }    
    elsif ($format eq 'html') {
        $contentType = 'content-type: text/html';
        $string = &delim2html($fileName);
        print "$contentType\n\n";
        print "$string";
    }
    elsif ($format eq 'text') {
        $contentType = 'content-type: text/plain';
        open (SCOREFILE, "$fileName");
        @stringArray = <SCOREFILE>;
        close (SCOREFILE);
        $string = join '', @stringArray;
        print "$contentType\n\n";
        print "$string";
    }
    elsif ($format eq 'tab') {
        $contentType = 'content-type: webwork/txt';
        open (SCOREFILE, "$fileName");
        @stringArray = <SCOREFILE>;
        close (SCOREFILE);
        $string = join '', @stringArray;
        $string =~ s|\t|_TAB_|g;
        $string =~ s|,|\t|g;  
        print "Content-disposition: attachment; filename= \"${shortFileName}.txt\"\n";      
        print "$contentType\n\n";
        print "$string";
    }
    else { wwerror($0, "Unknown format $format");}        
    exit;
}

    