#!/usr/bin/env bash
set -e

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
ROOT_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"

# Colors
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

usage() {
    echo "Usage: $0 [ENVIRONMENT] [CONFIG_NAME]"
    echo ""
    echo "Update Kubernetes ConfigMaps from YAML files"
    echo ""
    echo "Arguments:"
    echo "  ENVIRONMENT   Target environment: dev or prod (default: dev)"
    echo "  CONFIG_NAME   Specific config to update (optional, updates all if not specified)"
    echo ""
    echo "Available configs:"
    echo "  relay-config     - ZMQ relay configuration"
    echo "  ingestor-config  - CCXT ingestor configuration"
    echo "  flink-config     - Flink job configuration"
    echo "  gateway-config   - Gateway configuration"
    echo ""
    echo "Examples:"
    echo "  $0                          # Update all dev configs"
    echo "  $0 dev                      # Update all dev configs"
    echo "  $0 dev relay-config         # Update only relay-config in dev"
    echo "  $0 prod                     # Update all prod configs"
    echo "  $0 prod flink-config        # Update only flink-config in prod"
    exit 1
}

# Parse arguments
ENV="${1:-dev}"
CONFIG_NAME="${2:-}"

if [[ "$ENV" != "dev" && "$ENV" != "prod" ]]; then
    echo -e "${RED}Error: Environment must be 'dev' or 'prod'${NC}"
    usage
fi

CONFIG_DIR="$ROOT_DIR/deploy/k8s/$ENV/configs"

if [ ! -d "$CONFIG_DIR" ]; then
    echo -e "${RED}Error: Config directory not found: $CONFIG_DIR${NC}"
    exit 1
fi

# Set kubectl command and warn for prod
if [[ "$ENV" == "prod" ]]; then
    KUBECTL="kubectl --context=prod"
    echo -e "${YELLOW}⚠️  WARNING: Updating PRODUCTION configs!${NC}"
    echo -e "${YELLOW}kubectl context: prod${NC}"
    read -p "Are you sure you want to continue? (yes/no): " confirm
    if [[ "$confirm" != "yes" ]]; then
        echo "Aborted."
        exit 0
    fi
else
    KUBECTL="kubectl"
fi

apply_config() {
    local config_name="$1"
    local config_file="$CONFIG_DIR/$config_name.yaml"

    if [ ! -f "$config_file" ]; then
        echo -e "${RED}✗ Config file not found: $config_file${NC}"
        return 1
    fi

    echo -e "${GREEN}→${NC} Creating/updating ConfigMap $config_name..."

      $KUBECTL create configmap "$config_name" \
          --from-file=config.yaml="$config_file" \
          --dry-run=client -o yaml | $KUBECTL apply -f -
    echo -e "${GREEN}✓${NC} $config_name updated"

    # Optionally restart pods that use this config
    local restart_pods=""
    case "$config_name" in
        relay-config)
            restart_pods="deployment/relay"
            ;;
        ingestor-config)
            restart_pods="deployment/ingestor"
            ;;
        flink-config)
            restart_pods="deployment/flink-jobmanager deployment/flink-taskmanager"
            ;;
        gateway-config)
            restart_pods="deployment/gateway"
            ;;
    esac

    if [ -n "$restart_pods" ]; then
        echo -e "${YELLOW}  Restarting pods...${NC}"
        $KUBECTL rollout restart $restart_pods 2>/dev/null || echo -e "${YELLOW}  (No pods found to restart)${NC}"
    fi
}

# Update specific config or all configs
if [ -n "$CONFIG_NAME" ]; then
    # Update single config
    apply_config "$CONFIG_NAME"
else
    # Update all configs
    echo -e "${GREEN}Updating all $ENV configs...${NC}"
    echo ""

    if [[ "$ENV" == "prod" ]]; then
        CONFIGS=(
            "relay-config"
            "ingestor-config"
            "flink-config"
            "gateway-config"
        )
    else
        CONFIGS=(
            "relay-config"
            "ingestor-config"
            "flink-config"
        )
    fi

    FAILED=0
    for config in "${CONFIGS[@]}"; do
        if ! apply_config "$config"; then
            FAILED=$((FAILED + 1))
        fi
    done

    echo ""
    if [ $FAILED -gt 0 ]; then
        echo -e "${YELLOW}⚠️  $FAILED config(s) failed to apply${NC}"
        exit 1
    else
        echo -e "${GREEN}✓ All configs updated successfully${NC}"
    fi
fi
