#!/bin/sh

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

usage="usage: ./surgery.sh -i input-dir/ [-ft 'input-file-types'] -t template-file [-w wrap-file]"

# 1. Parse input

prev_opt=""
in_dir=""
file_types=""
template_file=""
reverse_input=false

for arg in "$@"
do
    if [ -z $prev_opt ]; then # option args
        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
                ;;

            '-i'|'--in-dir' )
                # input files
                if [ -n "$in_dir" ]
                then
                    echo "error: input dir already defined"
                    echo "$usage"
                    exit 1
                fi
                prev_opt='-i'
                ;;

            '-ft'|'--file-type' )
                prev_opt='-ft'
                ;;

            *)
                echo "invalid argument '$arg'"
                echo "$usage"
                exit 1
                ;;
        esac

    else # file args
        if [ "$prev_opt" = '-t' ]; then
            template_file="$arg"
        elif [ "$prev_opt" = '-w' ]; then
            wrap_file="$arg"
        elif [ "$prev_opt" = '-i' ]; then
            in_dir="$arg"
        elif [ "$prev_opt" = '-ft' ]; then
            file_types="$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 ! [ -d "$in_dir" ]; then
    echo "error: input dir is not a directory";
    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

nl=$(printf "\n")

i=1
organ_html=""
for in_file in "$in_dir"/*; do
    skip_file=false
    if [ -n "$file_types" ]; then
        skip_file=true
        # cf. https://stackoverflow.com/questions/2352380/how-to-get-extension-of-a-file-in-shell-script
        in_file_ext=$(echo "$in_file" | awk -F '.' '{ if (NF>1) {print $NF} }')
        for ft in $file_types; do
            if [ "$in_file_ext" = "$ft" ]; then
                skip_file=false
                break
            fi
        done
    fi

    if [ "$skip_file" = false ]; then
        post_html=$("$par_dir"/parasite.awk "$in_file")
        if [ $use_wrap = true ]; then
            postname=$(basename "$in_file")
            if [ "$reverse_input" = true ]; then
                organ_html="$("$par_dir/frankenstein.awk" -v organ="$post_html" -v title="$postname" -v number="$i" "$wrap_file")${nl}${organ_html}"
            else
                organ_html="${organ_html}${nl}$("$par_dir/frankenstein.awk" -v organ="$post_html" -v title="$postname" -v number="$i" "$wrap_file")"
            fi
        else
            if [ "$reverse_input" = true ]; then
                organ_html="${post_html}${nl}${organ_html}"
            else
                organ_html="${organ_html}${nl}${post_html}"
            fi
        fi
        i=$(expr "$i" + 1)
    fi
done

# tmp file workaround for "argument list too long"
tmp_fname="${TMPDIR}/tmp/surgery.${RANDOM}"
printf "%s" "$organ_html" > "$tmp_fname"

"$par_dir/frankenstein.awk" -v organ_file="$tmp_fname" "$template_file"

