#!/bin/sh

#
# Initialize a new symfony app
#

DOCKERFILES_ROOT="misc/images"
KUSTOMIZE_DIR="misc/k8s/kustomization"
SKELL_GIT_URL="https://forge.cadoles.com/CadolesKube/symfony-kube-skeletor.git"

run_form() {
  local conf_dest="${1}"

  echo "Welcome !"
  echo
  read -p "What is your application name (myapp) ? " appName
  local appName=${appName:-myapp} 

  read -p "Where do you want to start your versions ? (0.0.1) : " initVersion
  local initVersion=${initVersion:-0.0.1}

  read -p "List your standard git branches (stable staging dev) : " initBranches
  local initBranches=${initBranches:-"stable staging dev"}
  local branches=""
  for br in ${initBranches}; do
    branches="${branches}\"${br}\", "
  done

  read -p "Docker registry address (reg.cadoles.com) : " dockerRegistry
  local dockerRegistry=${dockerRegistry:-reg.cadoles.com}
   
  cat <<__EOF__ > ${conf_dest}
{ 
  "app": {
    "name": "${appName}",
    "init_version": "${initVersion}",
    "branches": [ ${branches::-2} ]
  },
  "registry": {
    "address": "${dockerRegistry}"
  }
}
__EOF__
}

create_docker_secret() {
  local conf="${1}"
  local registry=$(jq -cr ".registry.address" ${conf})

  docker login ${registry}
  mkdir -p ${KUSTOMIZE_DIR}/base/secrets/dockerconfig
  mkdir -p ${KUSTOMIZE_DIR}/overlays/dev/secrets/dockerconfig
  
  docker --config ${KUSTOMIZE_DIR}/base/secrets/dockerconfig login ${registry}
  mv ${KUSTOMIZE_DIR}/base/secrets/dockerconfig/config.json ${KUSTOMIZE_DIR}/base/secrets/dockerconfig/.dockerconfigjson
  cp ${KUSTOMIZE_DIR}/base/secrets/dockerconfig/.dockerconfigjson ${KUSTOMIZE_DIR}/overlays/dev/secrets/dockerconfig/.dockerconfigjson
}

init_app() {
  local conf="${1}"
  local appDest="${2}/${appName}"

  jq empty ${conf}
  if [ ${?} -ne 0 ]; then
    echo "Invalid application configuration ${conf}"
    return 3
  fi

  if [ ! -d ${appDest} ]; then
    mkdir -p ${appDest}
  else
    echo "Error ${appDest} allready exists"
    return 2
  fi

  git clone ${SKELL_GIT_URL} ${appDest}

  cd ${appDest}
  rm -rf .git
  rm -rf init-app

  echo "Setting Dockerfiles"
  dirs=$(find ${DOCKERFILES_ROOT}/* -type d -name 'myapplication-*')
  for d in ${dirs}; do
      mv ${d} $(echo ${d} | sed "s/myapplication/${appName}/g")
  done
  echo "Setting Kustomization directories"
  dirs=$(find ${KUSTOMIZE_DIR}/* -type d -name 'myapplication-*')
  for d in ${dirs}; do
      mv ${d} $(echo ${d} | sed "s/myapplication/${appName}/g")
  done

  echo "Setting Kustomization files"
  dirs=$(find ${KUSTOMIZE_DIR}/* -type f -name 'myapplication-*')
  for d in ${dirs}; do
      mv ${d} $(echo ${d} | sed "s/myapplication/${appName}/g")
  done
  
  grep -rl "myapplication" ${KUSTOMIZE_DIR} | xargs sed -i "s/myapplication/${appName}/g"

  echo "Setting Skaffold configuration"
  sed -i "s/myapplication/${appName}/g" ${appDest}/skaffold.yaml

  echo "Setting docker registry secrets"
  create_docker_secret ${conf}

  cd -
}

main() {
  local cleanup="0"
  if [ -n "${1}" ]; then
    app_conf="$(pwd)/${1}"
  else
    cleanup="1"
    app_conf=$(mktemp)
    run_form "${app_conf}"
    cat ${app_conf}
  fi

  local appName=$(jq -cr ".app.name" ${app_conf})
  appName=${appName,,}
  local appDest=${2:-"/tmp/${appName}"}

  init_app ${app_conf} ${appDest}

  if [ "${cleanup}" -eq 1 ]; then
    rm -rf ${app_conf}
  fi
}

CONFIG=""
DEST="/tmp"

while getopts "c:d:" option
do
  case $option in 
    c) CONFIG=${OPTARG} ;;
    d) DEST=${OPTARG} ;;
  esac
done

main "${CONFIG}" "${DEST}"