#!/usr/bin/env bash
set -euo pipefail

REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
DASHBOARD_DIR="${HOMELAB_GRAFANA_DASHBOARD_DIR:-${REPO_ROOT}/bootstrap/platform/grafana-dashboards}"
NAMESPACE="${HOMELAB_GRAFANA_NAMESPACE:-monitoring}"
KUBECONFIG_PATH="${KUBECONFIG:-${LAB_KUBECONFIG_PATH:-${HOME}/.kube/config}}"

usage() {
    cat <<EOF
Usage: ./jeannie grafana-dashboards {list|apply}

list   Show repo-managed dashboard files.
apply  Rebuild Grafana dashboard ConfigMaps and restart Grafana.
EOF
}

list_dashboards() {
    find "$DASHBOARD_DIR" -maxdepth 1 -type f -name '*.json' -print | sort
}

apply_dashboards() {
    local file
    local base
    local name
    local grafana_workload=""

    if ! command -v kubectl >/dev/null 2>&1; then
        echo "kubectl is required." >&2
        exit 1
    fi
    if [ ! -s "$KUBECONFIG_PATH" ]; then
        echo "kubeconfig is missing: $KUBECONFIG_PATH" >&2
        exit 1
    fi

    while IFS= read -r file; do
        base="$(basename "$file")"
        name="homelab-grafana-${base%.json}"
        echo "Applying Grafana dashboard ConfigMap ${NAMESPACE}/${name} from ${base}..."
        kubectl --kubeconfig "$KUBECONFIG_PATH" -n "$NAMESPACE" create configmap "$name" \
            --from-file="$base=$file" \
            --dry-run=client -o yaml |
            kubectl --kubeconfig "$KUBECONFIG_PATH" apply -f -
        kubectl --kubeconfig "$KUBECONFIG_PATH" -n "$NAMESPACE" label configmap "$name" grafana_dashboard=1 --overwrite
        kubectl --kubeconfig "$KUBECONFIG_PATH" -n "$NAMESPACE" annotate configmap "$name" grafana_folder=Homelab --overwrite
    done < <(list_dashboards)

    echo "Restarting Grafana so the sidecar reloads dashboards..."
    if kubectl --kubeconfig "$KUBECONFIG_PATH" -n "$NAMESPACE" get deployment prometheus-stack-grafana >/dev/null 2>&1; then
        grafana_workload="deployment/prometheus-stack-grafana"
    elif kubectl --kubeconfig "$KUBECONFIG_PATH" -n "$NAMESPACE" get statefulset prometheus-stack-grafana >/dev/null 2>&1; then
        grafana_workload="statefulset/prometheus-stack-grafana"
    else
        grafana_workload="$(
            kubectl --kubeconfig "$KUBECONFIG_PATH" -n "$NAMESPACE" get deployment,statefulset \
                -l app.kubernetes.io/name=grafana \
                -o name 2>/dev/null | head -n 1
        )"
    fi

    if [ -z "$grafana_workload" ]; then
        echo "Grafana workload was not found in namespace ${NAMESPACE}; dashboards were applied but Grafana was not restarted." >&2
        echo "Check with: kubectl -n ${NAMESPACE} get deploy,sts | grep grafana" >&2
        return 1
    fi

    kubectl --kubeconfig "$KUBECONFIG_PATH" -n "$NAMESPACE" rollout restart "$grafana_workload"
}

case "${1:-list}" in
    list)
        list_dashboards
        ;;
    apply|rebuild)
        apply_dashboards
        ;;
    -h|--help|help)
        usage
        ;;
    *)
        usage >&2
        exit 1
        ;;
esac
