#!/usr/bin/bash
if [ $# -lt 1 ]; then
  echo -e "\e[93mPlease provide your desired project name as argument.\033[0m"
  echo -e "\e[93m  Usage: ros2 run flexbe_widget create_repo <project name> [meta_package_name] [--non-interactive]
  echo -e ""
  echo -e "  By default the script will use the <project name> as the [meta_package_name]
  exit 2
fi

name=$1
meta_package_name=$1
interactive=true

echo -e "\e[96mInitializing new flexbe project repo \e[1m${name} ...\033[0m"

# Clear interactive flag if either argument is --non-interactive
if [ "${2:-}" = "--non-interactive" ] || [ "${3:-}" = "--non-interactive" ]; then
    echo "Running in non-interactive mode for CI tests ..."
    interactive=false
fi

# Set meta_package_name if $2 or $3 is provided and not "--non-interactive"
if [ -n "${2:-}" ] && [ "$2" != "--non-interactive" ]; then
    meta_package_name="$2"
elif [ -n "${3:-}" ] && [ "$3" != "--non-interactive" ]; then
    meta_package_name="$3"
fi


# Check the desired directory
# Note, someone may want to put this in another folder, so it
#       is not necessarily incorrect to run from different folder
if [[ ":$WORKSPACE_ROOT/src:" != ":$PWD:" ]]; then
  echo -e "\e[93mNormally we run this command from the \$WORKSPACE_ROOT/src folder.\e[0m"
  echo -e "\e[93m  not ${PWD}\e[0m"
  while $interactive; do
    read -p "Do you want to continue at current location? (yes/no) " yn
    case $yn in
      yes|Yes|y|Y|YES )
        break;;
      no|No|n|N|NO )
          while true; do
            read -p "Do you want to change to \$WORKSPACE_ROOT/src and continue? (yes/no) " yn
            case $yn in
              yes|Yes|y|Y|YES )
                cd ${WORKSPACE_ROOT}/src
                if [[ ":$WORKSPACE_ROOT/src:" != *":$PWD"* ]]; then
                  echo "Invalid folder ${PWD} - quit!"
                  exit
                fi
                echo "Continuing from ${PWD} ..."
                break;;
              no|No|n|N|NO )
                echo -e "\e[93mChange to appropriate directory and retry!\e[0m";
                exit;;
              * )
                echo "invalid response"
                exit;;
            esac
          done;;
      * )
          echo "invalid response"
          exit;;
    esac
  done
  echo ""
fi

echo ""
echo -e "\e[96m(2/5) Fetching project structure...\033[0m"
git clone https://github.com/FlexBE/flexbe_project_behaviors.git ${meta_package_name}
if [ ! $? -eq 0 ]; then
    echo -e "\e[92mFailed to clone the structure!\033[0m"
    exit
fi

cd ${meta_package_name}

echo -e "\e[96mSet up for ROS 2 development ...\033[0m"
git fetch
git checkout ros2-devel  # use new ROS 2 flexbe_webui workspace layout, remove when merged into main

echo ""
echo -e "\e[96m(3/5) Configuring project template...\033[0m"

# update the flexbe_states folder
sed -i -e "s/PROJECT_flexbe_states/${name}_flexbe_states/g" \
  PROJECT_flexbe_states/CHANGELOG.rst \
  PROJECT_flexbe_states/package.xml \
  PROJECT_flexbe_states/setup.py \
  PROJECT_flexbe_states/setup.cfg \
  PROJECT_flexbe_states/tests/example_state.test \
  PROJECT_flexbe_states/tests/example_action_state.test \
  PROJECT_flexbe_states/tests/run_colcon_test.py \
  PROJECT_flexbe_states/tests/run_tests.launch.py

mv PROJECT_flexbe_states/PROJECT_flexbe_states PROJECT_flexbe_states/${name}_flexbe_states
mv PROJECT_flexbe_states/resource/PROJECT_flexbe_states PROJECT_flexbe_states/resource/${name}_flexbe_states
mv PROJECT_flexbe_states ${name}_flexbe_states

# update the flexbe_behaviors folder
sed -i -e "s/PROJECT_flexbe_behaviors/${name}_flexbe_behaviors/g" \
  PROJECT_flexbe_behaviors/bin/copy_behavior \
  PROJECT_flexbe_behaviors/CHANGELOG.rst \
  PROJECT_flexbe_behaviors/CMakeLists.txt \
  PROJECT_flexbe_behaviors/package.xml \
  PROJECT_flexbe_behaviors/manifest/example_behavior.xml \
  PROJECT_flexbe_behaviors/manifest/example_action_state_behavior.xml \
  PROJECT_flexbe_behaviors/setup.py \
  PROJECT_flexbe_behaviors/setup.cfg

sed -i -e "s/PROJECT/${name}/g" PROJECT_flexbe_behaviors/bin/copy_behavior

mv PROJECT_flexbe_behaviors/PROJECT_flexbe_behaviors PROJECT_flexbe_behaviors/${name}_flexbe_behaviors
mv PROJECT_flexbe_behaviors/resource/PROJECT_flexbe_behaviors PROJECT_flexbe_behaviors/resource/${name}_flexbe_behaviors
mv PROJECT_flexbe_behaviors ${name}_flexbe_behaviors

# Handle the meta-package folder
sed -i -e "s/PROJECT_behaviors/${meta_package_name}/g" \
  PROJECT_behaviors/CMakeLists.txt \
  PROJECT_behaviors/package.xml \
  PROJECT_behaviors/CHANGELOG.rst
sed -i -e "s/PROJECT/${name}/g" \
  PROJECT_behaviors/CMakeLists.txt \
  PROJECT_behaviors/package.xml \
  PROJECT_behaviors/CHANGELOG.rst

mv PROJECT_behaviors ${meta_package_name}

sed -i -e "s/PROJECT_behaviors/${meta_package_name}/g" README.md
sed -i -e "s/PROJECT/${name}/g" README.md

echo ""
echo -e "\e[96m(4/5) Removing the original git repository...\033[0m"
rm -rf .git

while $interactive; do
  read -p "(5/5) Do you want to initialize a new Git repository for this project? (yes/no) " yn

  case $yn in
    yes|Yes|y|Y|YES )
      echo -e "\e[96m(5/5) Initializing new repository...\033[0m";
      git init -b main
      git add .
      git commit -m "Initial commit"
      echo ""
      echo -e "\e[92mCongratulations\033[0m, your new repository \e[1m${name}\033[0m  is ready to be pushed!"
      echo -e "Please run the following commands to push it:"
      echo -e "  git remote add origin [your_repo_url]"
      echo -e "  git push origin main"
      echo ""
      break;;
    no|No|n|N|NO ) echo "Skipping git initialization!";
      break;;
    * ) echo invalid response;;
  esac
done

echo ""
echo -e "Clone the following repository for a user interface (editor + runtime control) for FlexBE:"
echo -e "  git clone https://github.com/FlexBE/flexbe_webui.git"
echo ""
echo -e "Consider running rosdep to update any missing dependencies ..."
echo -e "  rosdep install --from-paths src --ignore-src -r -y"
echo ""
echo -e "\e[96mMake sure to build your workspace using colcon and run setup.bash as usual.\033[0m"
echo ""
echo -e "\e[92mSee the README.md for more information about this project.\033[0m"
echo ""
echo -e "\e[92mFinished!\033[0m"
cd ..  # Back to the starting point
