#!/usr/bin/env bash

source .utils

set -e
NAMESPACE=""
CONTEXT="$(kubectl config current-context)"

print_usage() {
  blue "kube-empty-namespace - Force delete all resources in the provided namespace"
  echo " "
  underline "Usage:"
  echo "kube-empty-namespace"
  echo " "
  underline "Options:"
  echo "-h, --help            show this help text"
  echo "    --context         sets the context from the kubeconfig to use"
  echo "-n, --namespace       the namespace the resources are in (required)"
}

YOLO="0"
POS_ARGS=()

while test $# -gt 0; do
  case "$1" in
    -n|--namespace)
      shift
      NAMESPACE=$1
      shift
      ;;
    -h|--help)
      print_usage
      exit 0
      ;;
    --context)
      shift
      CONTEXT="$1"
      shift
      ;;
    --yolo)
      YOLO="1"
      shift
      ;;
    *)
      POS_ARGS+=(`echo $1 | tr '/' ' '`)
      shift
      ;;
  esac
done

if [[ "${NAMESPACE}" == "" ]]; then
  echo "Please provide the namespace to empty"
  exit 1
fi

function deleteResource() {
  RES="${1//.v1/}"
  kubectl --context "${CONTEXT}" patch -p '{"metadata":{"finalizers":null}}' --type=merge -n ${NAMESPACE} ${RES} 1>/dev/null || printf ""
  kubectl --context "${CONTEXT}" delete -n ${NAMESPACE} ${RES} 2>/dev/null || printf ""
}

printf "⚠️  This could leave cloud resources undeleted if finalizers aren't honoured ⚠️\n\n"

RESOURCES=()

if [[ "${YOLO}" == 0 ]]; then
  printf "Are you sure you want to force delete all resources in '${NAMESPACE}'? (y/n): "
  read CONFIRM
else
  echo ""
  echo ""
  orange "YOLO MODE!!! (What could go wrong?!)"
  CONFIRM="y"
fi

if [ "${CONFIRM}" = "y" ]; then
  echo ""
  echo "💣  OK, I hope you know what you're doing..."
  echo "Deleting all resources in namespace '${NAMESPACE}'"
  echo ""

  NAMES="$(kubectl --context "${CONTEXT}" api-resources --namespaced --verbs list -o name 2>/dev/null | tr '\n' ,)"
  RESOURCES=$(kubectl --context "${CONTEXT}" get "${NAMES::${#NAMES}-1}" --ignore-not-found -n ${NAMESPACE} -o go-template='{{range.items}}{{.kind}}.{{.apiVersion}}/{{.metadata.name}}{{"\n"}}{{end}}' 2>/dev/null | tr '[:upper:]' '[:lower:]' | sed -r "s|/(v.+)/|/|g")

  IFS='
'
  for RESOURCE in ${RESOURCES}
  do
    deleteResource ${RESOURCE}
  done
else
  echo "Aborting..."
  exit 1
fi
