#!/usr/bin/env bash
###########################################################
#./kube-provisioning.sh dev cicd-user kubeconfig-dev.yaml
#arg1 = namespace
#arg2 = env  (dev|qa|prod)
###########################################################

set -euo pipefail

############################################
# CONFIG
############################################

NAMESPACE=${1:-dev}-$2
SERVICE_ACCOUNT="deployer"
KUBECONFIG_FILE=${NAMESPACE}.yaml

echo "Namespace: $NAMESPACE"
echo "ServiceAccount: $SERVICE_ACCOUNT"
echo "Output kubeconfig: $KUBECONFIG_FILE"

############################################
# CHECK REQUIREMENTS
############################################

if ! command -v kubectl >/dev/null 2>&1; then
  echo "kubectl not found"
  exit 1
fi

############################################
# CREATE NAMESPACE
############################################

kubectl get ns "$NAMESPACE" >/dev/null 2>&1 || kubectl create namespace "$NAMESPACE"

############################################
# CREATE SERVICE ACCOUNT
############################################

kubectl -n "$NAMESPACE" get sa "$SERVICE_ACCOUNT" >/dev/null 2>&1 || \
kubectl -n "$NAMESPACE" create serviceaccount "$SERVICE_ACCOUNT"

############################################
# CREATE ROLE
############################################

cat <<EOF | kubectl apply -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: namespace-deployer
  namespace: $NAMESPACE
rules:
- apiGroups: ["", "apps", "batch", "networking.k8s.io"]
  resources: ["*"]
  verbs: ["*"]
EOF

############################################
# CREATE ROLE BINDING
############################################

kubectl -n "$NAMESPACE" get rolebinding namespace-deployer-binding >/dev/null 2>&1 || \
kubectl create rolebinding namespace-deployer-binding \
  --role=namespace-deployer \
  --serviceaccount=${NAMESPACE}:${SERVICE_ACCOUNT} \
  -n "$NAMESPACE"

############################################
# GENERATE TOKEN
############################################

TOKEN=$(kubectl create token "$SERVICE_ACCOUNT" -n "$NAMESPACE")

############################################
# CLUSTER INFO
############################################

CLUSTER_NAME=$(kubectl config view --minify -o jsonpath='{.clusters[0].name}')
CLUSTER_SERVER=$(kubectl config view --minify -o jsonpath='{.clusters[0].cluster.server}')
CLUSTER_CA=$(kubectl config view --raw --minify -o jsonpath='{.clusters[0].cluster.certificate-authority-data}')

############################################
# GENERATE KUBECONFIG
############################################

cat <<EOF > "$KUBECONFIG_FILE"
apiVersion: v1
kind: Config
clusters:
- cluster:
    certificate-authority-data: ${CLUSTER_CA}
    server: ${CLUSTER_SERVER}
  name: ${CLUSTER_NAME}

contexts:
- context:
    cluster: ${CLUSTER_NAME}
    namespace: ${NAMESPACE}
    user: ${SERVICE_ACCOUNT}
  name: ${SERVICE_ACCOUNT}-${CLUSTER_NAME}

current-context: ${SERVICE_ACCOUNT}-${CLUSTER_NAME}

users:
- name: ${SERVICE_ACCOUNT}
  user:
    token: ${TOKEN}
EOF

echo
echo "Kubeconfig generated:"
echo "$KUBECONFIG_FILE"

echo
echo "Test command:"
echo "kubectl --kubeconfig=$KUBECONFIG_FILE get pods"
