#!/usr/bin/env bash

function addExtensions() {
  local extensions=${1}

  if [[ ${EXTENSIONS} == "" ]]
  then
    EXTENSIONS="${extensions}"
  else
    EXTENSIONS="${EXTENSIONS},${extensions}"
  fi
}

function createQuarkusProject() {

  # GIT_API=${GIT_API:-https://api.github.com/user/repos}
  # GIT_KEYS=${GIT_KEYS:-${HOME}/.git_token}
  EXTENSIONS=""
  BASE_EXTENSIONS="resteasy-reactive-jackson,rest-client-reactive-jackson,smallrye-health,config-yaml"
  GITEA="false"
  QUARKUS_VERSION=""
  
  for i in "$@"
  do
    case $i in
      -a=*|--app=*)
        APP_NAME="${i#*=}"
      ;;
      -g=*|--group-id=*)
        GROUP_ID="${i#*=}"
      ;;
      -q=*|--quarkus-ver=*)
        QUARKUS_VERSION="--platform-bom=io.quarkus.platform:quarkus-bom:${i#*=}.Final"
      ;;
      -x=*|--extensions=*)
        addExtensions "${i#*=}"
      ;;
      -j=*|--java=*)
        JAVA_VER="${i#*=}"
      ;;
      -b|--base)
        addExtensions "${BASE_EXTENSIONS}"
      # -u=*|--git-url=*)
      #   GIT_URL="${i#*=}"
      # ;;
      # -o=*|--git-org=*)
      #   GIT_API="https://api.github.com/orgs/${i#*=}/repos"
      # ;;
    esac
  done

  JAVA_VER=${JAVA_VER:-17}

  quarkus create app --maven --java=${JAVA_VER} --no-wrapper --no-code --package-name=${GROUP_ID}.${APP_NAME} --extensions=${EXTENSIONS} ${QUARKUS_VERSION} ${GROUP_ID}:${APP_NAME}:0.1
  
  cd ${APP_NAME}
  rm README.md
  touch README.md
  mkdir -p ./src/test/java/${GROUP_ID//.//}/${APP_NAME}
  touch ./src/test/java/${GROUP_ID//.//}/.gitkeep
  mkdir -p ./src/main/java/${GROUP_ID//.//}/${APP_NAME}/{aop,api,dto,collaborators,event,mapper,model,service}
  touch ./src/main/java/${GROUP_ID//.//}/${APP_NAME}/{aop,api,dto,collaborators,event,mapper,model,service}/.gitkeep
  git init -b main
  git add .
  git commit -m "create repo"
  cd -
}

function gitInit(){

  # Unused right now.

  local project=${1}
  
  curl -u ${GIT_USER}:${ACCESS_TOKEN} -X POST ${GIT_API} -d "{\"name\":\"${project}\",\"private\":false}"
  git remote add origin ${GIT_URL}/${project}.git
  
  git push -u origin main
}

function addProperty() {

  for i in "$@"
    do
      case $i in
        -p=*|--property=*)
          PROPERTY="${i#*=}"
        ;;
        -v=*|--value=*)
          VALUE="${i#*=}"
        ;;
      esac
    done
    mv pom.xml pom.xml.tmp
    yq -p=xml ".project.properties += {\"${PROPERTY}\":\"${VALUE}\"}" pom.xml.tmp | yq -o=xml >> pom.xml
    rm pom.xml.tmp
}

function addDependency() {
  for i in "$@"
  do
    case $i in
      -g=*|--groupid=*)
        GROUP_ID="${i#*=}"
      ;;
      -a=*|--artifactid=*)
        ARTIFACT_ID="${i#*=}"
      ;;
      -v=*|--version=*)
        VERSION="${i#*=}"
      ;;
    esac
  done
  mv pom.xml pom.xml.tmp
  yq -p=xml ".project.dependencies.dependency += [{\"groupId\":\"${GROUP_ID}\",\"artifactId\":\"${ARTIFACT_ID}\",\"version\":\"${VERSION}\"}]" pom.xml.tmp | yq -o=xml >> pom.xml
  rm pom.xml.tmp
}

function printHelp() {
  echo "Usage:"
  echo "  code --create [-b] -a=<application name> -g=<group id> [-q=<Quarkus Version>] [-x=<comma delimeted list of Quarkus extensions.]"
  echo "    The --create subcommand will create the scaffolding for a new Quarkus project with the Maven build tool."
  echo "    The -b option will include dependencies for a basic REST service/client."
  echo "  code --property -p=<property name> -v=<property value>"
  echo "    The --property subcommand adds a property to your pom.xml"
  echo "  code --dependency -g=<group ID> -a=<artifact ID> -v=<version>"
  echo "    The --dependency subcommand adds a new dependency to your pom.xml"
}

for i in "$@"
do
  case $i in
    --create)
      createQuarkusProject "$@"
    ;;
    --property)
      addProperty "$@"
    ;;
    --dependency)
      addDependency "$@"
    ;;
    --help)
      printHelp
    ;;
  esac
done