#!/bin/csh -f

# Create a new $1.sc file from roster.txt in the standard Loyola
# format using $1-scinit.csh in the current directory (copied from
# ~/bin/courses if none already in current directory).  Sets all
# entries in "POST" column to "EMAIL", unless the EADDR column
# in roster.txt has no "@" in it; then use "NONE".

if (! -e roster.txt) then
  echo roster.txt nonexistent
  exit
endif

set filebase = $1

if (-e $filebase.sc) then
  set content = `egrep -c 'let [A-Z][A-Z]*[0-9][0-9]* = [0-9.][0-9.]*$$' $filebase.sc`
  if ($content > 0) then
    echo Grades have been entered into $filebase.sc so will not update from roster.txt
    exit
  endif
  del . $filebase.sc
endif

set temppost = /tmp/scnew.$USER.$$

echo 'set numeric tblstyle = latex craction = 1' > $filebase.sc

set colno2let = (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z)

set CP = 1
set HW = 2
set EX = 3
set PA = 4
set LB = 5
set QZ = 6
set firstlet = ("" "" "" "" "" "" "" "") # Extra spots in case add to above list of constants
set lastlet = ("" "" "" "" "" "" "" "") # Extra spots in case add to above list of constants
set totlet = ("" "" "" "" "" "" "" "") # Extra spots in case add to above list of constants
set droplet = ("" "" "" "" "" "" "" "") # Extra spots in case add to above list of constants
set weight = ("" "" "" "" "" "" "" "") # Extra spots in case add to above list of constants

if (! -e $filebase-scinit.csh) cp ~/bin/courses/$filebase-scinit.csh .

source $filebase-scinit.csh

set lastrow = `cat roster.txt | wc -l`

@ lastrow--

set possrow = `expr $lastrow + 2`

set statfn = (max min avg stddev)
set statrow = (`expr $possrow + 2` `expr $possrow + 3` `expr $possrow + 4` `expr $possrow + 5`)

set colno = 0
foreach heading ($colno2head)
  @ colno++
  set numeric
  set collet = $colno2let[$colno]
  if ("$heading" == "NAME" || "$heading" == "EADDR" || "$heading" == "STUDENTID") then
    set tempwidth = `cat roster.txt | excol "$heading" | wc -L`
    if ($colno2width[$colno] < $tempwidth) set colno2width[$colno] = $tempwidth
  endif
  echo format $collet $colno2width[$colno] 0 0 >> $filebase.sc
  echo rightstring ${collet}0 = \"$heading\" >> $filebase.sc
  if ("$heading" == "NAME") then
    unset numeric
# Following is old version for rosters with names in strange uppercase format; bad for e.g., "III" suffix.
#     ((cat roster.txt | excol NAME | tail -n +2 | tr -d ',' | uc2cap); echo ''; echo POSSIBLE; echo ''; echo MAX; echo MIN; echo AVG; echo STDDEV) \
#       | awk '{name = $1}\
#              $2 != "" {name = name ","; for (i=2;i<=NF;i++) name = name " " $i;}\
    ((cat roster.txt | excol NAME | tail -n +2); echo ''; echo POSSIBLE; echo ''; echo MAX; echo MIN; echo AVG; echo STDDEV) \
      | awk '{name = $0}\
             {print "rightstring '$collet'" NR " = \"" name "\""}' \
      >> $filebase.sc
  endif
  if ("$heading" =~ HW[0-9a-z]) then
    if ($firstlet[$HW] == "") set firstlet[$HW] = $collet
    set lastlet[$HW] = $collet
  endif
  if ("$heading" == "HWT") set totlet[$HW] = $collet
  if ("$heading" == "HWD") set droplet[$HW] = $collet
  if ("$heading" =~ LB[0-9a-z]) then
    if ($firstlet[$LB] == "") set firstlet[$LB] = $collet
    set lastlet[$LB] = $collet
  endif
  if ("$heading" == "LBT") set totlet[$LB] = $collet
  if ("$heading" == "LBD") set droplet[$LB] = $collet
  if ("$heading" =~ QZ[0-9a-z]) then
    if ($firstlet[$QZ] == "") set firstlet[$QZ] = $collet
    set lastlet[$QZ] = $collet
  endif
  if ("$heading" == "QZT") set totlet[$QZ] = $collet
  if ("$heading" == "QZD") set droplet[$QZ] = $collet
  if ("$heading" =~ PA[0-9a-z]) then
    if ($firstlet[$PA] == "") set firstlet[$PA] = $collet
    set lastlet[$PA] = $collet
  endif
  if ("$heading" == "PAT") set totlet[$PA] = $collet
  if ("$heading" == "PAD") set droplet[$PA] = $collet
  if ("$heading" =~ CP[0-9a-z]) then
    if ($firstlet[$CP] == "") set firstlet[$CP] = $collet
    set lastlet[$CP] = $collet
  endif
  if ("$heading" == "CPT") set totlet[$CP] = $collet
  if ("$heading" == "CPD") set droplet[$CP] = $collet
  if (("$heading" =~ EX[0-9a-z]) || ("$heading" == "FIN")) then
    if ($firstlet[$EX] == "") set firstlet[$EX] = $collet
    set lastlet[$EX] = $collet
  endif
  if ("$heading" == "EXT") set totlet[$EX] = $collet
  if ("$heading" == "EXD") set droplet[$EX] = $collet
  if ("$heading" == "SEM") set SEMlet = $collet
  if ("$heading" == "MDL") unset numeric
  if ("$heading" == "LET") unset numeric
  if ("$heading" == "POST") then
    unset numeric
    set POSTlet = $collet
  endif
  if ("$heading" == "EADDR") then
    unset numeric
    set EADDRlet = $collet
    ((cat roster.txt | excol $heading | tail -n +2 | tr -d ' '); \
     echo ''; echo $LUCEADDR) \
      | awk '{print "rightstring '$collet'" NR " = \"" $0 "\""}' \
      >> $filebase.sc
  endif
  if ("$heading" == "CLS" || "$heading" == "NUMBER" || "$heading" == "STUDENTID") then
    unset numeric
    set lastentry = ''
    if ("$heading" == "NUMBER") then
      set lastentry = 'p33823'
    endif
    ((cat roster.txt | excol $heading | tail -n +2 | tr -d ' '); \
     echo ''; echo $lastentry) \
      | awk '{print "rightstring '$collet'" NR " = \"" $0 "\""}' \
      >> $filebase.sc
  endif
  if ($?numeric) then
    foreach i (1 2 3 4)
        echo "let $collet$statrow[$i] = @$statfn[$i](${collet}1:$collet$lastrow)" \
          >> $filebase.sc
    end
  endif
end

foreach num (`(cat roster.txt; echo ''; echo POSSIBLE) | tail -n +2 | grep -nv '^$' | sed 's+:.*++'`)
  foreach tletno ($CP $HW $LB $QZ $EX $PA)
    if (($totlet[$tletno] != "") && ($firstlet[$tletno] != "")) echo "let $totlet[$tletno]$num = @if($firstlet[$tletno]"\$"$possrow,100*@sum($firstlet[$tletno]${num}:$lastlet[$tletno]$num)/@sum($firstlet[$tletno]"\$"${possrow}:$lastlet[$tletno]"\$"$possrow),0)" >> $filebase.sc
    if (($droplet[$tletno] != "") && ($firstlet[$tletno] != "")) then
      set range = "$firstlet[$tletno]${num}:$lastlet[$tletno]$num"
      echo  "let $droplet[$tletno]$num = @if($firstlet[$tletno]"\$"$possrow,(100/$firstlet[$tletno]"\$"$possrow)*(@sum($range)-@min(1,@count($range)-1)*@min($range))/@max(1,@count($range)-1),0)" >> $filebase.sc
    endif
  end
  if ($?SEMlet) then
    echo -n "let $SEMlet$num = " >> $filebase.sc
    if (! $?semweight) then
      foreach tletno ($CP $HW $LB $QZ $EX $PA)
        if ($weight[$tletno] != "") echo -n "$weight[$tletno]*$totlet[$tletno]$num + " >> $filebase.sc
      end
    else
      set colno = 0
      foreach colweight ($semweight)
        @ colno++
        if($semweight[$colno] != 0) echo -n "$semweight[$colno]*$colno2let[$colno]$num +" >> $filebase.sc
      end
    endif
    echo " 0" >> $filebase.sc
  endif
end

sed -n 's+^rightstring '$EADDRlet'\([1-9][0-9]* = .*\)+rightstring '$POSTlet'\1+p' $filebase.sc > $temppost

sed 's+\('$POSTlet'[0-9]* = \).*@.*+\1"EMAIL"+' $temppost >> $filebase.sc

rm -f $temppost
