#!/usr/bin/env bash

source .utils

NAMESPACE="$(kubectl config view --minify --output 'jsonpath={..namespace}' &>/dev/null)"
set -e
NAMESPACE=${NAMESPACE:-default}
SELECTOR=""
CONTEXT="$(kubectl config current-context)"

print_usage() {
  blue "kube-force-delete - Force delete resources, even those with finalizers"
  echo " "
  underline "Usage:"
  echo "kube-force-delete [RESOURCE_TYPE] [RESOURCE_NAME]"
  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 resource is in (default: current namespace)"
}

YOLO="0"
POS_ARGS=()

while test $# -gt 0; do
  case "$1" in
    -n|--namespace)
      shift
      NAMESPACE=$1
      shift
      ;;
    -l|--selector)
      shift
      SELECTOR="$1"
      shift
      ;;
    -h|--help)
      print_usage
      exit 0
      ;;
    --context)
      shift
      CONTEXT="$1"
      shift
      ;;
    --yolo)
      YOLO="1"
      shift
      ;;
    /)
      # We want to ignore slash seperators between resource types and names
      shift
      ;;
    *)
      POS_ARGS+=(`echo $1 | tr '/' ' '`)
      shift
      ;;
  esac
done

if [ ${#POS_ARGS[@]} -lt 2 ] && [[ "${SELECTOR}" == "" ]]; then
  echo "Please provide the resource type and name to delete"
  exit 1
fi

function deleteResource() {
  RES="${1//.v1/}"
  echo "Deleting ${RES}"
  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 [[ "${SELECTOR}" == "" ]]; then
  printf "Are you sure you want to delete ${POS_ARGS[0]}/${POS_ARGS[1]}? (y/n): "
  RESOURCES=("${POS_ARGS[0]}/${POS_ARGS[1]}")
else
  printf "Are you sure you want to delete all matching '${SELECTOR}'? (y/n): "
fi

if [[ "${YOLO}" == 0 ]]; then
  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..."

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

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