#!/bin/bash

# Variables
META_GRAMMAR="MetaGrammar"
META_RULE="processor"
GEN_GRAMMAR="Grammar"

# Base msg colors
RED="\033[1;31m"
YELLOW="\033[0;33m"
GREEN="\033[0;32m"
NC="\033[0m" # No Color


# Help message.
_help() {
    printf "${GREEN}$(basename $0)${NC}\n"
    printf "Practice linguistic rules.\n"

    echo

    printf "${YELLOW}USAGE:${NC}\n"
    printf "    | $(basename $0) [-h | help]\n"
    printf "    | $(basename $0) [-g | generate] <RULES> <INPUT>\n"
    printf "    | $(basename $0) [-r | run]\n"
    printf "    | $(basename $0) [-c | clean]\n"

    echo

    printf "${YELLOW}OPTIONS:${NC}\n"
    printf "    ${GREEN}-h${NC}, ${GREEN}help${NC}              Help message.\n"
    printf "    ${GREEN}-g${NC}, ${GREEN}generate${NC}          Generates Grammar sources.\n"
    printf "    ${GREEN}-r${NC}, ${GREEN}run${NC}               Compiles Grammar sources, running it given the sentence as input.\n"
    printf "    ${GREEN}-c${NC}, ${GREEN}clean${NC}             Cleans files.\n"
    
    echo

    printf "${YELLOW}ARGS:${NC}\n"
    printf "    ${GREEN}<RULES>${NC}               Sentence rules (STRUCTURE + ERRORS blocks).\n"
    printf "    ${GREEN}<INPUT>${NC}               Parsed input (INPUT block).\n"
}

# Generates the grammar.
generate() {
    # checks if arguments are empty
    if [ "$1" = "" ] || [ "$2" = "" ]; then
        exit -1
    fi
    
    # checks if files passed as arguments exist
    if [ ! -f "$1" ] || [ ! -f "$2" ]; then
        printf "${RED}ERROR:${NC} Files given as argument are not valid!\n"
        exit -1
    fi

    #########################################################################
    
    cat $1 $2 > input/meta-lang

    java -jar lib/MetaGrammar.jar input/meta-lang && mkdir -p target
    mv phrase.tmp input/
    mv Grammar.g4 target/

    java -jar lib/antlr-4.8-complete.jar target/Grammar.g4
}

# Runs the grammar with phrase as input.
run() {
    javac target/*.java
    (cd target/ && java -cp "../lib/antlr-4.8-complete.jar:$CLASSPATH" org.antlr.v4.gui.TestRig ${GEN_GRAMMAR} main ../input/phrase.tmp -gui)  
}

# Clean files.
clean() {
    rm -rf target
    rm -f input/meta-lang
    rm -f input/phrase.tmp
}


# Main #
while [ "$1" != "" ]; do
    case "$1" in
        -h | help)
            _help
            exit
            ;;
        
        -g | generate)
            generate $2 $3
            exit
            ;;

        -r | run)
            run
            exit
            ;;
        
        -c | clean)
            clean
            exit
            ;;
        
        *)
            printf "${RED}ERROR:${NC} Option '$1' is not available...\n"
            echo
            printf "USAGE:\n"
            printf "    | $(basename $0) [-h | help]\n"
            printf "    | $(basename $0) [-g | generate] <RULES> <INPUT>\n"
            printf "    | $(basename $0) [-r | run]\n"
            printf "    | $(basename $0) [-c | clean]\n"
            echo
            printf "For more information try ${GREEN}-h${NC} or ${GREEN}help${NC}\n"
            exit
            ;;
    esac
done
