#!/bin/bash

echo "[+] Script execution started."

CLEANED=()
FAILED=()

log_success() {
  echo "[OK] $1 cleaned up."
  CLEANED+=("$1")
}

log_fail() {
  echo "[FAIL] $1 cleanup failed."
  FAILED+=("$1")
}

# Detect OS
if [ -f /etc/redhat-release ]; then
  PACKAGE_MANAGER="yum"
elif [ -f /etc/lsb-release ]; then
  PACKAGE_MANAGER="apt"
else
  echo "[-] Unsupported operating system. Exiting."
  exit 1
fi

# --- radm reset ---
echo "[+] Running radm reset ..."
if sudo radm reset -f; then
  log_success "radm"
else
  log_fail "radm"
fi

# --- SymChecker ---
echo "[+] Removing SymChecker ..."
if {
  sudo systemctl stop symchecker 2>/dev/null
  sudo systemctl disable symchecker 2>/dev/null
  sudo rm -rf /usr/local/bin/symchecker /etc/systemd/system/symchecker.service
}; then
  log_success "SymChecker"
else
  log_fail "SymChecker"
fi

# --- CNI ---
echo "[+] Removing cni ..."
if sudo rm -rf /etc/cni/net.d/; then
  log_success "CNI"
else
  log_fail "CNI"
fi

# --- Calico ---
echo "[+] Removing Calico leftovers ..."
if {
  sudo rm -rf /var/lib/calico /etc/cni/net.d/* /var/lib/cni/* /opt/cni/bin/*
}; then
  log_success "Calico"
else
  log_fail "Calico"
fi

# --- Consul ---
echo "[+] Removing consul ..."
if {
  sudo systemctl stop consul 2>/dev/null
  sudo systemctl disable consul 2>/dev/null
  sudo rm -rf /usr/local/bin/consul /etc/consul.d /var/lib/consul /tmp/consul_* \
    /etc/systemd/system/consul.service /etc/resolvconf/resolv.conf.d/head
}; then
  log_success "Consul"
else
  log_fail "Consul"
fi

# --- etcd ---
echo "[+] Removing etcd ..."
if {
  sudo systemctl stop etcd 2>/dev/null
  sudo systemctl disable etcd 2>/dev/null
  if [ "$PACKAGE_MANAGER" = "yum" ]; then
    sudo yum -y remove etcd
  else
    sudo apt-get -y remove etcd
  fi
  sudo rm -rf /var/lib/etcd/* /tmp/etcd-* /usr/local/bin/etcd* /usr/bin/etcd* /etc/default/etcd /etc/etcd-certs
}; then
  log_success "etcd"
else
  log_fail "etcd"
fi

# --- Kubernetes ---
echo "[+] Removing k8s ..."
if {
  sudo systemctl stop kubelet 2>/dev/null
  sudo systemctl disable kubelet 2>/dev/null
  if [ "$PACKAGE_MANAGER" = "yum" ]; then
    sudo yum -y remove kubelet kubeadm kubectl kubernetes-cni cnitool-plugins cnitool
  else
    sudo apt-get -y remove kubelet kubeadm kubectl kubernetes-cni cnitool-plugins cnitool
  fi
  sudo rm -rf /usr/bin/containerd /etc/kubernetes/* /etc/default/kubeadm.conf \
    /root/.kube/config /home/ubuntu/.kube/config /etc/kubernetes/kubelet.conf \
    /etc/kubernetes/*.conf /var/lib/kubelet/* /root/.kube/ /usr/local/k8s \
    /usr/bin/kubeadm /usr/bin/kubectl /usr/bin/kubelet /tmp/consul* /tmp/docker* \
    /tmp/kube* ~/.kube/ /etc/systemd/system/kube* /etc/systemd/system/docker* \
    /etc/kubernetes /etc/cni/net.d/* /var/lib/cni/* /var/lib/calico/ \
    /var/lib/dockershim/ /var/openebs/ /usr/bin/containerd-shim /var/lib/kubelet/
}; then
  log_success "Kubernetes"
else
  log_fail "Kubernetes"
fi

# --- Remove kubeconfig files ---
echo "[+] Removing kubeconfig ..."
if sudo rm -rf ~/.kube /root/.kube /home/*/.kube; then
  log_success "kubeconfig"
else
  log_fail "kubeconfig"
fi

# --- Docker ---
echo "[+] Removing docker ..."
if {
  sudo systemctl stop docker 2>/dev/null
  sudo systemctl disable docker 2>/dev/null
  if [ "$PACKAGE_MANAGER" = "yum" ]; then
    sudo yum remove -y docker docker-engine docker.io containerd runc cuda docker-ce \
      nvidia-docker2 nvidia-container-runtime
  else
    sudo apt-get -y remove docker docker-engine docker.io containerd runc cuda docker-ce \
      nvidia-docker2 nvidia-container-runtime
  fi
  sudo rm -rf /var/lib/docker/ /opt/rafay/ /tmp/cuda-repo /etc/docker/daemon.json /etc/docker
  sudo rm -rf /usr/local/bin/docker /usr/local/sbin/runc
  sudo umount /var/lib/docker 2>/dev/null || true
}; then
  log_success "Docker"
else
  log_fail "Docker"
fi

# --- Registry ---
echo "[+] Removing local registry ..."
if {
  sudo systemctl stop registry 2>/dev/null
  sudo systemctl disable registry 2>/dev/null
  sudo rm -rf /var/lib/registry /etc/docker/registry /etc/systemd/system/registry*
}; then
  log_success "Registry"
else
  log_fail "Registry"
fi

# --- Auth Registry ---
echo "[+] Removing auth registry ..."
if {
  sudo systemctl stop auth-registry 2>/dev/null
  sudo systemctl disable auth-registry 2>/dev/null
  sudo rm -rf /etc/systemd/system/auth-registry*
}; then
  log_success "Auth Registry"
else
  log_fail "Auth Registry"
fi

# --- Rafay Directories ---
echo "[+] Removing Rafay directories ..."
if sudo rm -rf /opt/rafay /var/log/rafay /var/lib/rafay; then
  log_success "Rafay"
else
  log_fail "Rafay"
fi

# --- Helm ---
echo "[+] Removing helm ..."
if sudo rm -rf /usr/local/bin/helm /tmp/helm-*; then
  log_success "Helm"
else
  log_fail "Helm"
fi

# --- CRI-O Cache ---
echo "[+] Removing CRI-O Cache ..."
if sudo rm -rf /var/lib/crio/*; then
  log_success "CRI-O Cache"
else
  log_fail "CRI-O Cache"
fi

# --- Containerd ---
echo "[+] Removing containerd ..."
if {
  sudo systemctl stop containerd 2>/dev/null
  sudo systemctl disable containerd 2>/dev/null
  if [ "$PACKAGE_MANAGER" = "yum" ]; then
    sudo yum remove -y containerd
  else
    sudo apt-get -y remove containerd
  fi
  sudo rm -rf /etc/containerd /usr/bin/containerd /var/lib/containerd
}; then
  log_success "Containerd"
else
  log_fail "Containerd"
fi

# --- Cleanup loaded images ---
echo "[+] Removing container images ..."
if {
  sudo ctr -n k8s.io images rm $(sudo ctr -n k8s.io images ls -q) 2>/dev/null || true
  sudo docker image prune -a -f 2>/dev/null || true
}; then
  log_success "Images"
else
  log_fail "Images"
fi

# --- TCP Offload service ---
echo "[+] Removing TCP offload service ..."
if sudo rm -rf /etc/systemd/system/disable-tcp-offload.service; then
  log_success "TCP Offload"
else
  log_fail "TCP Offload"
fi

# --- Unmount orphan mounts ---
echo "[+] Unmounting orphan mounts ..."
if mount | grep /var/lib/kubelet/ > /dev/null; then
  sudo umount -f /var/lib/kubelet/* 2>/dev/null || true
fi
log_success "Orphan mounts"

# --- iptables / IPVS ---
echo "[+] Flushing iptables and IPVS rules ..."
if {
  sudo iptables -F
  sudo iptables -t nat -F
  sudo iptables -t mangle -F
  sudo iptables -X
  sudo ipvsadm --clear 2>/dev/null || true
}; then
  log_success "iptables"
else
  log_fail "iptables"
fi

# --- SELinux ---
selinux_files=("/etc/sysconfig/selinux" "/etc/selinux/config")
SELINUX_DISABLED=false
for file in "${selinux_files[@]}"; do
  if [ -f "$file" ]; then
    if sudo sed -i 's/^SELINUX=.*/SELINUX=disabled/' "$file"; then
      echo "SELinux disabled in $file."
      SELINUX_DISABLED=true
    fi
    break
  fi
done
if $SELINUX_DISABLED; then
  log_success "SELinux"
else
  log_fail "SELinux"
fi

# --- br_netfilter ---
if sudo modprobe br_netfilter; then
  log_success "br_netfilter"
else
  log_fail "br_netfilter"
fi

# --- Final Summary ---
echo ""
echo "==================== Cleanup Summary ===================="
echo "Successful cleanups:"
for s in "${CLEANED[@]}"; do
  echo "  - $s"
done

if [ ${#FAILED[@]} -gt 0 ]; then
  echo ""
  echo "Failed cleanups:"
  for f in "${FAILED[@]}"; do
    echo "  - $f"
  done
else
  echo ""
  echo "No failures. All components cleaned up successfully."
fi
echo "========================================================="
echo ""
echo "[+] Script execution completed."
echo "[+] Reboot is required for changes to take effect. Please reboot the node manually."
