#!/bin/bash
#                     The MCLinker project
#
# This file is distributed under the University of Illinois Open Source
# License. See LICENSE.TXT for details.

############################
# Design Pattern - Builder, using BASH
# 0. watch configuration
# 1. ask name
# 2. ask email
#  i. write back to configuration
# 3. ask file type
#  i. ask deployment
# 4. ask file name
# 5. copy templates
# 6. replace the keywords

############################
# Variable Dictionary
MCLINKER_CONFIG_DIR=$HOME/.bold
AUTHOR=
EMAIL=
CLASS_NAME=
BRIEF=
FILE_TYPE=

# 0. watch configuration
if [ -d "${MCLINKER_CONFIG_DIR}" ]; then
	if [ -f "${MCLINKER_CONFIG_DIR}/config" ]; then
		source ${MCLINKER_CONFIG_DIR}/config
	fi
else
	mkdir ${MCLINKER_CONFIG_DIR}
fi

# 1. ask name
#  i. write back to configuration
if [ -z "${AUTHOR}" ]; then
	echo -n "name? ";
	read AUTHOR
	echo "AUTHOR=\"${AUTHOR}\"" >> ${MCLINKER_CONFIG_DIR}/config
fi

# 2. ask email
#  i. write back to configuration
if [ -z "${EMAIL}" ]; then
	echo -n "e-mail? ";
	read EMAIL
	echo "EMAIL=\"${EMAIL}\"" >> ${MCLINKER_CONFIG_DIR}/config
fi

# 3. ask file type
echo "What type of files you want to create?";
echo " 1) normal source code"
echo " 2) test case"

while [ -z "${FILE_TYPE}" ]; do
	echo -n "your choice? ";
	read FILE_TYPE

	case "$FILE_TYPE" in
	1 ) source ${MCLINKERTOP}/scripts/normal_files.sh;
		FILE_TYPE="normal";
		;;
	2 ) source ${MCLINKERTOP}/scripts/test_files.sh;
		FILE_TYPE="testcase";
		;;
	* ) FILE_TYPE="" ;;
	esac
done

# 3.i ask deployment
if [ "${FILE_TYPE}" = "normal" ]; then
	echo "Where you what to deploy?";
	echo " 1) ADT"
	echo " 2) MC"
	echo " 3) Target"
	echo " 4) CodeGen"
	echo " 5) Support"
	echo " 6) LD"

	while [ -z "${DEPLOYMENT}" ]; do
		echo -n "your choice? ";
		read DEPLOYMENT

		case "${DEPLOYMENT}" in
		1 ) DEPLOYMENT="ADT";;
		2 ) DEPLOYMENT="MC";;
		3 ) DEPLOYMENT="Target";;
		4 ) DEPLOYMENT="CodeGen";;
		5 ) DEPLOYMENT="Support";;
		6 ) DEPLOYMENT="LD";;
		* ) DEPLOYMENT="";;
		esac
	done
fi

# 3.ii ask Target
if [ "${DEPLOYMENT}" = "Target" ]; then
	echo "What is your Target?";
	echo " 1) Target"
	echo " 2) Target/ARM"
	echo " 3) Target/X86"
	echo " 4) Target/Mips"

	while [ -z "${TARGET}" ]; do
		echo -n "your choice? ";
		read TARGET
		case "${TARGET}" in
		1 ) TARGET=".";;
		2 ) TARGET="ARM"
		    source ${MCLINKERTOP}/scripts/target_files.sh;
			;;
		3 ) TARGET="X86"
		    source ${MCLINKERTOP}/scripts/target_files.sh;
			;;
		4 ) TARGET="Mips"
		    source ${MCLINKERTOP}/scripts/target_files.sh;
			;;
		* ) TARGET="";;
		esac
	done
	DEPLOYMENT="${DEPLOYMENT}/${TARGET}"
fi

# 4. ask file name
ask_filename
read CLASS_NAME

ask_brief ${CLASS_NAME}
read BRIEF

# 5. copy the templates
TARGET_FILE=$(copy_template_header ${CLASS_NAME} ${DEPLOYMENT})

# 6. replace the keywords
replace_author  ${TARGET_FILE} ${AUTHOR}
repalce_email ${TARGET_FILE} ${EMAIL} 
replace_class ${TARGET_FILE} ${CLASS_NAME} 
replace_brief ${TARGET_FILE} ${BRIEF}

# 5. copy the templates
TARGET_FILE=$(copy_template_impl ${CLASS_NAME} ${DEPLOYMENT})

# 6. replace the keywords
replace_author  ${TARGET_FILE} ${AUTHOR}
repalce_email ${TARGET_FILE} ${EMAIL} 
replace_class ${TARGET_FILE} ${CLASS_NAME} 
replace_brief ${TARGET_FILE} ${BRIEF}
