#!/usr/bin/sh

home_dir=${PWD}

project_name="ProjectTest"
dep_project="DependentProject"
module_name="ModuleTest"
py_module_name="PyModuleTest"
version="1.0"

# Create unique directory
tmploc=$(mktemp -dq -t temp.XXXXXXXX)

# Clean and exit
local_clean_exit() {
  cd ${home_dir}
  rm -rf ${tmploc}
  exit $1
}

# Set to the User_area
export User_area=${tmploc}

cd ${tmploc} || local_clean_exit 1

CreateElementsProject --help
# Error? stop and clean up
if [ $? -ne 0 ]; then
 echo "Error: <CreateElementsProject --help command failed!" 1>&2
  local_clean_exit 1
fi

CreateElementsProject $project_name $version -d $dep_project $version --yes

# Error? stop and clean up
if [ $? -ne 0 ]; then
  echo "Error: <CreateElementsProject $project_name $version> command failed!" 1>&2
  local_clean_exit 1
fi

# Test --yes option
CreateElementsProject $project_name $version -d $dep_project $version --yes

# Error? stop and clean up
if [ $? -ne 0 ]; then
   echo "Error: <CreateElementsProject $project_name $version> command failed!" 1>&2
   local_clean_exit 1
fi

# Make sure the project has been created
if [ ! -d $project_name ]; then
   echo "Error: <$project_name> directory not found!" 1>&2
   local_clean_exit 1
fi

# Make sure mandatory files has been created
if [ ! -e $User_area/$project_name/$version/CMakeLists.txt ]; then
   echo "Error: <$User_area/$project_name/$version/CMakeLists.txt> file not found" 1>&2
   local_clean_exit 1
fi
if [ ! -e $User_area/$project_name/$version/.gitignore ]; then
   echo "Error: <$User_area/$project_name/$version/.gitignore> file not found" 1>&2
   local_clean_exit 1
fi
if [ ! -e $User_area/$project_name/$version/.gitattributes ]; then
   echo "Error: <$User_area/$project_name/$version/.gitattributes> file not found" 1>&2
   local_clean_exit 1
fi
if [ ! -e $User_area/$project_name/$version/.editorconfig ]; then
  echo "Error: <$User_area/$project_name/$version/.editorconfig> file not found" 1>&2
  local_clean_exit 1
fi
if [ ! -e $User_area/$project_name/$version/Makefile ]; then
   echo "Error: <$User_area/$project_name/$version/Makefile> file not found" 1>&2
   local_clean_exit 1
fi
if [ ! -e $User_area/$project_name/$version/doc/mainpage.dox ]; then
   echo "Error: <$User_area/$project_name/$version/doc/mainpage.dox> file not found" 1>&2
   local_clean_exit 1
fi
if [ ! -e $User_area/$project_name/$version/doc/doc_project.rst ]; then
   echo "Error: <$User_area/$project_name/$version/doc/doc_project.rst> file not found" 1>&2
   local_clean_exit 1
fi
if [ ! -e $User_area/$project_name/$version/.clang-format ]; then
   echo "Error: <$User_area/$project_name/$version/.clang-format> file not found" 1>&2
   local_clean_exit 1
fi
if [ ! -e $User_area/$project_name/$version/.clang-format-ignore ]; then
   echo "Error: <$User_area/$project_name/$version/.clang-ignore> file not found" 1>&2
   local_clean_exit 1
fi
if [ ! -e $User_area/$project_name/$version/CHANGELOG.md ]; then
   echo "Error: <$User_area/$project_name/$version/CHANGELOG.md> file not found" 1>&2
   local_clean_exit 1
fi
if [ ! -e $User_area/$project_name/$version/.pre-commit-config.yaml ]; then
   echo "Error: <$User_area/$project_name/$version/.pre-commit-config.yaml> file not found" 1>&2
   local_clean_exit 1
fi

# Make sure <Project_test> is there
result=$( grep "$project_name $version" $User_area/$project_name/$version/CMakeLists.txt )
if [ $? -ne 0 ]; then
   echo "Error: <$project_name $version> not found in <$User_area/$project_name/$version/CMakeLists.txt> file!" 1>&2
   local_clean_exit 1
fi

#  Make sure elements_project macro contains the dependent project
result=$( grep "$dep_project $version" $User_area/$project_name/$version/CMakeLists.txt )
if [ $? -ne 0 ]; then
   echo "Error: <$dep_project $version> not found in <$User_area/$project_name/$version/CMakeLists.txt> file!" 1>&2
   local_clean_exit 1
fi

cd ${User_area}/${project_name}/${version} || local_clean_exit 1

AddElementsModule ${module_name} --yes

# Error? stop and clean up
if [ $? -ne 0 ]; then
   echo "Error: <AddElementsModule ${module_name} command failed!" 1>&2
   local_clean_exit 1
fi

cd ${module_name} || local_clean_exit 1

AddPythonModule ${py_module_name} --yes

# Error? stop and clean up
if [ $? -ne 0 ]; then
   echo "Error: <AddPythonModule ${py_module_name} command failed!" 1>&2
   local_clean_exit 1
fi


cd ${tmploc} || local_clean_exit 1

# Test a wrong project name
project_name="WrongProjectTest]"
version="1.0"

CreateElementsProject $project_name $version --yes

if [ $? -eq 0 ]; then
   echo "Error: this <$project_name> project name should failed but it did not!" 1>&2
   local_clean_exit 1
fi


cd ${tmploc} || local_clean_exit 1

# Test a wrong version number
project_name="WrongProjectTest"
version="1.0]"

CreateElementsProject $project_name $version --yes

if [ $? -eq 0 ]; then
   echo "Error: this <$version> version number should failed but it did not!" 1>&2
   local_clean_exit 1
fi

cd ${tmploc} || local_clean_exit 1

# Test the <HEAD> version number
project_name="ProjectHeadTest"
version="HEAD"

CreateElementsProject $project_name $version --yes

if [ $? -ne 0 ]; then
   echo "Error: this <$version> version number should not failed!!!" 1>&2
   local_clean_exit 1
fi

# Test the visibility option
project_name="ProjectVisibilityTest"
version="1.0"

CreateElementsProject $project_name $version -V --yes
pattern="ELEMENTS_HIDE_SYMBOLS ON"
result=$( grep "${pattern}" "${project_name}/${version}/CMakeLists.txt" )

if [ $? -ne 0 ]; then
   echo "Error: No < $pattern...etc...> pattern found in CMakeLists.txt in this <$project_name> project name!" 1>&2
   local_clean_exit 1
fi
local_clean_exit 0
