#!/bin/bash

MODULE_PATH=$(realpath ${0%/*})

# JARs
UCOMP=microcompiler.jar
COMP=compiler.jar
WEAVER=weaver.jar

# Main classes
UCOMPMAIN=MicrocompilerKt
COMPMAIN=CompilerKt
WEAVERMAIN=WeaverKt

# Random number generator
RGEN=rand_gen.py

# Intermediate file
INTER=comp.out


usage(){
    echo -e "Usage:\n\t$0 [TARGET] {TYPE | OUTFILE}\n\t$0 [TARGET] [MICROTARGET] [OUTFILE]\n\t$0 [TARGET] [TYPE] [OUTFILE] [COMBINE]\n\t$0 [TARGET] asm [OUTFILE] [COMBINE] [MICROTARGET]\n\nWhere:\n\tTARGET: main compilation target file\n\tTYPE: either \"asm\" or \"micro\"\n\tOUTFILE: output .mia file\n\tCOMBINE: existing .mia file to combine compilation output with\n\tMICROTARGET: explicit microinstruction target"
}

path_of(){
    echo "$MODULE_PATH/$1"
}

if [ $# -eq 0 ]; then
    >&2 echo "Not enough arguments!"
    usage
    exit
fi


TARGET=$1

case $# in
    1)
        TYPE="asm"
        OUTPUT="build.mia"
        ;;

    2)
        if [ "$2" = "asm" ] || [ "$2" = "micro" ] ; then
            TYPE=$2
            OUTPUT="build.mia"
        else
            TYPE="asm"
            OUTPUT=$2
        fi
        ;;

    3)
        if [ "$2" = "asm" ] || [ "$2" = "micro" ]; then
            TYPE=$2
            OUTPUT=$3
        else
            TYPE="asm"
            OUTPUT=$2
            MICRO=$3
        fi
        ;;

    4)
        TYPE=$2
        OUTPUT=$3
        COMBINE=$4
        ;;

    5)
        if [ "$2" != "asm" ]; then
            >&2 echo "TYPE must be asm"
            usage
            exit
        fi

        TYPE=$2
        OUTPUT=$3
        COMBINE=$4
        MICRO=$5
        ;;

    *)
        >&2 echo "Too many arguments!"
        usage
        exit
        ;;
esac

(cd $MODULE_PATH && make all)

if [ "$TYPE" = "asm" ]; then
    KJAR=$COMP
    KCLASS=$COMPMAIN
else
    KJAR=$UCOMP
    KCLASS=$UCOMPMAIN
fi

kotlin -classpath $(path_of $KJAR) $KCLASS $TARGET > $INTER || exit
python "$(path_of $RGEN)" >> $INTER

if [ "$COMBINE" = "" ]; then
    if [ "$MICRO" != "" ]; then
        kotlin -classpath $(path_of $UCOMP) $UCOMPMAIN $MICRO >> $INTER || exit
    fi

    kotlin -classpath $(path_of $WEAVER) $WEAVERMAIN $INTER $OUTPUT || exit
else
    if [ "$MICRO" != "" ]; then
        kotlin -classpath $(path_of $UCOMP) $UCOMPMAIN $MICRO >> $INTER || exit
    fi
    kotlin -classpath $(path_of $WEAVERJAR) $WEAVERMAIN $INTER $COMBINE $OUTPUT || exit
fi

# Remove intermediate compilation file
rm -f $INTER

echo "Compiled successfully to $OUTPUT"