#!/bin/sh

parasite_location=$( realpath $(dirname $(realpath "$0")) )

# 1. Parse input 

prev_opt=""
in_files=""
template_file=""
in_file_cnt=0
reverse_input=false

usage="usage: ./surgery.sh input-files ... -t template-file [-w wrap-file]"


# https://dwheeler.com/essays/filenames-in-shell.html#ifs
# TODO: handle tabs and newlines in filenames...
IFS="$(printf '\n\t')"
tab="$(printf '\t')"

for arg in "$@"
do
    if [ -z $prev_opt ] # option args
    then
        case $arg in 
           '-t'|'--template-file' )
               if [ -n "$template_file" ]
               then
                    echo "error: template-file already defined"
                    echo "$usage"
                    exit 1
               fi
                prev_opt='-t' 
                ;;

           '-w'|'--wrap-file' )
               if [ -n "$post_wrap_file" ]
               then
                    echo "error: wrap file-already defined"
                    echo "$usage"
                    exit 1
               fi
                prev_opt='-w' 
                ;;

           '-r'|'--reverse' )
                reverse_input=true
                ;;

            * )
                # input files
                if [ -n "$in_files" ]; then
                    in_files="${in_files}${tab}${arg}"
                else
                    in_files="$arg"
                fi
                in_file_cnt=$(expr "$in_file_cnt" + 1)
                ;;
        esac

    else # file args
        if [ "$prev_opt" = '-t' ]; then
            template_file="$arg"
        elif [ "$prev_opt" = '-w' ]; then
            wrap_file="$arg"
        else
          echo "argument parsing error (this should not happen lmao)"
            echo "$usage"
            exit 1
        fi
        prev_opt=''
    fi
done

# 2.) Perform the surgery

if [ -z "$in_files" ]; then
    echo "error: no input files";
    echo "$usage" 
    exit 1;
elif [ -z "$template_file" ]; then
    echo "error: no template file";
    echo "$usage" 
    exit 1;
elif ! [ -f "$template_file" ]; then
    echo "error: '$template_file' is not a file"
    echo "$usage"
    exit 1
fi

use_wrap=false
if [ -n "$wrap_file" ]
then
    if ! [ -f "$wrap_file" ]; then
        echo "error: '$wrap_file' is not a file"
        echo "$usage"
        exit 1
    else
        use_wrap=true
    fi
fi

i=1
if [ "$reverse_input" = true ]; then
    in_files=$(printf "$in_files" | tr '\t' '\n' | sort -r | tr '\n' '\t')
    i="$in_file_cnt"
fi

organ_html=""
# TODO: handle tabs and newlines in in filenames!
for in_file in $in_files
do
    post_html=$("$parasite_location"/parasite.awk "$in_file")
    if [ $use_wrap = true ]; then
        postname=$(basename "$in_file")
        organ_html="${organ_html}$("$parasite_location/frankenstein.awk" -v organ="$post_html" -v title="$postname" -v number="$i" "$wrap_file")\n"
    else
      organ_html="$organ_html ${post_html}\n"
    fi
    if [ "$reverse_input" = true ]; then
        i=$(expr "$i" - 1)
    else
        i=$(expr "$i" + 1);
    fi
done

"$parasite_location/frankenstein.awk" -v organ="$organ_html" "$template_file"

