#!/usr/bin/env bash
#Title			: calculate_num_mutated_programs.sh
#Usage			: bash calculate_num_mutated_programs.sh
#Author			: pmorvalho
#Date	 		: May 27, 2022
#Description    	: Prints the number of mutated programs generated using each type of program mutation
#Notes			: 
# (C) Copyright 2022 Pedro Orvalho.
#==============================================================================

mutations=("swap_comp_ops" "swap_if_else_sttms" "swap_incr_decr_ops" "decl_dummy_vars" "reorder_decls" "for_2_while" "all")
mutations_flags=("-c"  "-if" "-io" "-dv" "-rd" "-fw" "-a")
# mutations=("swap_comp_ops")
# mutations_flags=("-c")

if [[ $1 == "" ]]; then
    dataset="C-Pack-IPAs"
    labs=("lab02" "lab03" "lab04")      # we are not considering lab05 for this dataset, and only year 2020/2021 has lab05.
else
    labs=("lab3" "lab4" "lab5" "lab6")
    dataset="itsp"
fi

years=()

# mutations=("swap_if_else_sttms" "decl_dummy_vars")
# mutations_flags=("-if" "-dv")
# labs=("lab02")

for y in $(find $dataset/correct_submissions/* -maxdepth 0 -type d);
do
    y=$(echo $y | rev | cut -d '/' -f 1 | rev)
    years+=("$y")
    echo "Found year: "$y
done

# data_dir="/data/benchmarks/mutated_programs"
data_dir="mutated_programs"

mkdir results_csvs
output_file="results_csvs/"$dataset"-number_mutated_programs.txt"
echo "" > $output_file
# echo "" > results_csvs/$dataset-summary.txt

print_info(){
  # $1 - directory with the set of students' directoris mutated
  # $2 - shorten name to use for csv file
  local mut_dir=$1
  local mut_name=$2
  local mutated_progs=$((-1)) 	# -1 to not consider the original program
  for d in $(find $mut_dir/* -maxdepth 0 -type d);
  do
      for f in $(find $d/*.c -maxdepth 0 -type f);
      do
	  local mutated_progs=$((mutated_progs+1))
      done
  done
  echo $mut_name","$mutated_progs >> $output_file
  rm $mut_dir/*/var_*
  tar zcf $mut_dir.tar.gz $mut_dir  >> tar_log.log
  rm -rf $mut_dir
  echo $mutated_progs 
}

mutate_ex_programs(){
    local ex_dir=$1
    local out_dir=$2
    local info=$3
    local year=$4
    local lab=$5
    local ex=$6
    local n_mut=0
    local num_mut_progs_ex=0
    local n_mutations=0
    echo "Mutating "$ex_dir
    for((m1=0;m1<${#mutations[@]};m1++));
    do
	local mut1=${mutations[$m1]}
	local f1=${mutations_flags[$m1]}
	# echo $mut1
	local n_mutations=$(python prog_mutator.py -d $ex_dir -o $out_dir/$mut1 $f1 -ea -info)
	echo $info/$mut1","$n_mutations  | tee -a $output_file | tee -a results_csvs/$dataset-$year-$lab.txt | tee -a results_csvs/$dataset-$year.txt
	# local n_mutations=$(print_info $out_dir/$mut1 $info/$mut1)
	local n_mutations=$((n_mutations))
	num_mut_progs_ex=$((num_mut_progs_ex+n_mutations))
	n_mut=$((n_mut+1))
	# for((m2=m1+1;m2<${#mutations[@]};m2++));
	# do
	#     local mut2=${mutations[$m2]}
	#     local f2=${mutations_flags[$m2]}
	#     # echo $mut1-$mut2
	#     local n_mutations=$(python prog_mutator.py -d $ex_dir -o $out_dir/$mut1-$mut2 $f1 $f2 -ea -info)
	#     echo $info/$mut1-$mut2","$n_mutations >> $output_file
	#     # local n_mutations=$(print_info $out_dir/$mut1-$mut2 $info/$mut1-$mut2)
	#     local n_mutations=$((n_mutations))
	#     num_mut_progs_ex=$((num_mut_progs_ex+n_mutations))
 	#     n_mut=$((n_mut+1))
	#     for((m3=m2+1;m3<${#mutations[@]};m3++));
	#     do
	# 	local mut3=${mutations[$m3]}
	# 	local f3=${mutations_flags[$m3]}
	# 	# echo $mut1-$mut2-$mut3
	# 	local n_mutations=$(python prog_mutator.py -d $ex_dir -o $out_dir/$mut1-$mut2-$mut3 $f1 $f2 $f3 -ea -info)
	# 	echo $info/$mut1-$mut2-$mut3","$n_mutations >> $output_file
	# 	#local n_mutations=$(print_info $out_dir/$mut1-$mut2-$mut3 $info/$mut1-$mut2-$mut3)
	# 	local n_mutations=$((n_mutations))
	#         num_mut_progs_ex=$((num_mut_progs_ex+n_mutations))
	# 	n_mut=$((n_mut+1))
	# 	for((m4=m3+1;m4<${#mutations[@]};m4++));
	# 	do
	# 	    local mut4=${mutations[$m4]}
	# 	    local f4=${mutations_flags[$m4]}
	# 	    # echo $mut1-$mut2-$mut3-$mut4
	# 	    local n_mutations=$(python prog_mutator.py -d $ex_dir -o $out_dir/$mut1-$mut2-$mut3-$mut4 $f1 $f2 $f3 $f4 -ea -info)
	# 	    echo $info/$mut1-$mut2-$mut3$mut4","$n_mutations >> $output_file
	# 	    # local n_mutations=$(print_info $out_dir/$mut1-$mut2-$mut3-$mut4 $info/$mut1-$mut2-$mut3-$mut4)
	# 	    local n_mutations=$((n_mutations))
	# 	    num_mut_progs_ex=$((num_mut_progs_ex+n_mutations))
	# 	    n_mut=$((n_mut+1))
	# 	    for((m5=m4+1;m5<${#mutations[@]};m5++));
	# 	    do
	# 		local mut5=${mutations[$m5]}
	# 		local f5=${mutations_flags[$m5]}
	# 		# echo $mut1-$mut2-$mut3-$mut4-$mut5
	# 		local n_mutations=$(python prog_mutator.py -d $ex_dir -o $out_dir/$mut1-$mut2-$mut3-$mut4-$mut5 $f1 $f2 $f3 $f4 $f5 -ea -info)
	# 		echo $info/$mut1-$mut2-$mut3$mut4-$mut5","$n_mutations >> $output_file
	# 		# local n_mutations=$(print_info  $data_dir/$sub_type/$year/$lab/$ex/$mut1-$mut2-$mut3-$mut4-$mut5 $info/$mut1-$mut2-$mut3-$mut4-$mut5)
	# 		local n_mutations=$((n_mutations))
	#                 num_mut_progs_ex=$((num_mut_progs_ex+n_mutations))
	# 		n_mut=$((n_mut+1))
	# 		for((m6=m5+1;m6<${#mutations[@]};m6++));
	# 		do
	# 		    local mut6=${mutations[$m6]}
	# 		    local f6=${mutations_flags[$m6]}
	# 		    # echo $mut1-$mut2-$mut3-$mut4-$mut5
	# 		    local n_mutations=$(python prog_mutator.py -d $ex_dir -o $out_dir/$mut1-$mut2-$mut3-$mut4-$mut5-$mut6 $f1 $f2 $f3 $f4 $f5 $f6 -ea -info)
	# 		    echo $info/$mut1-$mut2-$mut3$mut4-$mut5-$mut6","$n_mutations >> $output_file
	# 		    # local n_mutations=$(print_info $out_dir/$mut1-$mut2-$mut3-$mut4-$mut5-$mut6 $info/$mut1-$mut2-$mut3-$mut4-$mut5-$mut6)
	# 		    local n_mutations=$((n_mutations))
	#                     num_mut_progs_ex=$((num_mut_progs_ex+n_mutations))
	# 		    n_mut=$((n_mut+1))
	# 		done
	# 	    done
	# 	done
	#     done
	# done
    done
    echo
    echo "Total "$info": "$num_mut_progs_ex | tee -a $output_file | tee -a results_csvs/$dataset-$year-$lab.txt | tee -a results_csvs/$dataset-$year.txt
}

mutate_lab_programs(){
    local lab_dir=$1
    local year=$2
    local lab=$3
    local sub_type=$4
    for ex in $(find $lab_dir/ex* -maxdepth 0 -type d);
    do
	ex=$(echo $ex | rev | cut -d '/' -f 1 | rev)
	mkdir -p  $data_dir/$sub_type/$year/$lab/$ex
	mutate_ex_programs  $lab_dir/$ex $data_dir/$sub_type/$year/$lab/$ex $year/$lab/$ex $year $lab $ex &
    done
    wait
}

mutate_programs(){
# $1 - year directory
# $2 - submissions directory
    local year=$1
    local sub_dir=$2
    local sub_type=$(echo $sub_dir | rev | cut -d '/' -f 1 | rev)
    # local total_number_mutated_progs=0
    for((l=0;l<${#labs[@]};l++));
    do
	lab=${labs[$l]}
	echo "" > results_csvs/$dataset-$year-$lab.txt
	mutate_lab_programs $sub_dir/$year/$lab $year $lab $sub_type  &
    done
    wait
}

echo "Starting program mutation..."
for((y=0;y<${#years[@]};y++));
do
    ys=${years[$y]}
    echo "" > results_csvs/$dataset-$ys.txt
    mutate_programs $ys $dataset/correct_submissions &
done