#!/bin/bash
# Clinic Auth Token Manager (API Key Authentication)
# Usage: source clinic-token.sh && get_clinic_auth
#
# Auth flow:
# 1. Check CLINIC_API_KEY in environment or .env file
# 2. Use API Key with Bearer Token authentication
#
# Setup: Create API Key at clinic.pingcap.com User Profile (requires internal=true user)

ENV_FILE="${ENV_FILE:-.env}"
CLINIC_API_BASE="https://clinic.pingcap.com/clinic/api/v1"

get_clinic_auth() {
    if [ -f "$ENV_FILE" ]; then
        source "$ENV_FILE"
    fi

    if [ -z "$CLINIC_API_KEY" ]; then
        echo "ERROR: CLINIC_API_KEY not set" >&2
        echo "Please set CLINIC_API_KEY in $ENV_FILE or environment" >&2
        echo "Create API Key at clinic.pingcap.com User Profile (requires internal user)" >&2
        return 1
    fi

    export CLINIC_API_KEY
    echo "Clinic API Key configured" >&2
    return 0
}

check_clinic_auth() {
    if [ -f "$ENV_FILE" ]; then
        source "$ENV_FILE"
    fi

    if [ -z "$CLINIC_API_KEY" ]; then
        return 1
    fi

    return 0
}

_ensure_clinic_auth() {
    if [ -n "$CLINIC_API_KEY" ]; then
        return 0
    fi
    get_clinic_auth
}

clinic_search_clusters() {
    local query="$1"
    local show_deleted="${2:-false}"
    local limit="${3:-10}"

    _ensure_clinic_auth || return 1

    curl -s "${CLINIC_API_BASE}/dashboard/clusters" \
        -H "Authorization: Bearer ${CLINIC_API_KEY}" \
        -G \
        --data-urlencode "query=${query}" \
        --data-urlencode "show_deleted=${show_deleted}" \
        --data-urlencode "limit=${limit}" \
        --data-urlencode "page=1"
}

clinic_get_cluster() {
    local org_id="$1"
    local cluster_id="$2"

    _ensure_clinic_auth || return 1

    curl -s "${CLINIC_API_BASE}/orgs/${org_id}/clusters/${cluster_id}" \
        -H "Authorization: Bearer ${CLINIC_API_KEY}"
}

clinic_get_cluster_by_id() {
    local cluster_id="$1"
    
    local search_result=$(clinic_search_clusters "$cluster_id")
    local org_id=$(echo "$search_result" | jq -r '.items[0].orgID // empty')
    
    if [ -z "$org_id" ]; then
        echo "Cluster not found: $cluster_id" >&2
        return 1
    fi
    
    clinic_get_cluster "$org_id" "$cluster_id"
}

clinic_get_resource_pool_components() {
    local org_id="$1"
    local cluster_id="$2"

    _ensure_clinic_auth || return 1

    curl -s "${CLINIC_API_BASE}/orgs/${org_id}/clusters/${cluster_id}/resource-pool/components" \
        -H "Authorization: Bearer ${CLINIC_API_KEY}"
}

clinic_get_topology() {
    local cluster_id="$1"
    
    local search_result=$(clinic_search_clusters "$cluster_id" "true")
    local org_id=$(echo "$search_result" | jq -r '.items[0].orgID // empty')
    local deploy_type=$(echo "$search_result" | jq -r '.items[0].clusterDeployType // empty')
    local parent_id=$(echo "$search_result" | jq -r '.items[0].parentID // empty')
    
    if [ -z "$org_id" ]; then
        echo "Cluster not found: $cluster_id" >&2
        return 1
    fi
    
    case "$deploy_type" in
        dedicated)
            clinic_get_cluster "$org_id" "$cluster_id" | jq '.components // empty'
            ;;
        shared|resource_pool)
            clinic_get_resource_pool_components "$org_id" "$cluster_id"
            ;;
        premium)
            if [ -n "$parent_id" ] && [ "$parent_id" != "null" ]; then
                clinic_get_resource_pool_components "$org_id" "$parent_id"
            else
                echo "Premium cluster has no parentID" >&2
                return 1
            fi
            ;;
        *)
            echo "Cluster type '$deploy_type' has no topology" >&2
            return 1
            ;;
    esac
}

export -f get_clinic_auth
export -f check_clinic_auth
export -f _ensure_clinic_auth
export -f clinic_search_clusters
export -f clinic_get_cluster
export -f clinic_get_cluster_by_id
export -f clinic_get_resource_pool_components
export -f clinic_get_topology
