#!/bin/bash
# ===================================================================
# Docker Versions Update Utility
# Updates central docker/versions.toml and syncs to environment files
# ===================================================================

set -e

# Script directory and project root
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
DOCKER_DIR="$PROJECT_ROOT/docker"
VERSIONS_TOML="$DOCKER_DIR/versions.toml"
BUILD_ARGS_DIR="$DOCKER_DIR/build-args"

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

# Function to print colored output
print_info() {
    echo -e "${BLUE}[INFO]${NC} $1"
}

print_success() {
    echo -e "${GREEN}[SUCCESS]${NC} $1"
}

print_warning() {
    echo -e "${YELLOW}[WARNING]${NC} $1"
}

print_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# Function to extract version from TOML file
get_version() {
    local key=$1
    grep "^$key = " "$VERSIONS_TOML" | sed 's/.*= "\(.*\)"/\1/' || echo ""
}

# Function to update version in TOML file
update_version() {
    local key=$1
    local new_value=$2

    if grep -q "^$key = " "$VERSIONS_TOML"; then
        # Update existing key
        sed -i.bak "s/^$key = .*/$key = \"$new_value\"/" "$VERSIONS_TOML"
        print_success "Updated $key to $new_value"
    else
        print_error "Key $key not found in $VERSIONS_TOML"
        return 1
    fi
}

# Function to sync TOML to environment files
sync_to_env_files() {
    print_info "Syncing versions.toml to environment files..."

    # Get current versions from TOML
    # shellcheck disable=SC2155
    local gradle_version=$(get_version "gradle")
    # shellcheck disable=SC2155
    local java_version=$(get_version "java")
    # shellcheck disable=SC2155
    local node_version=$(get_version "node")
    # shellcheck disable=SC2155
    local nginx_version=$(get_version "nginx")
    # shellcheck disable=SC2155
    local app_version=$(get_version "app-version")
    # shellcheck disable=SC2155
    local spring_default=$(get_version "spring-profiles-default")
    # shellcheck disable=SC2155
    local spring_docker=$(get_version "spring-profiles-docker")
    # shellcheck disable=SC2155
    local alpine_version=$(get_version "alpine")
    local prometheus_version=$(get_version "prometheus")
    local grafana_version=$(get_version "grafana")
    local keycloak_version=$(get_version "keycloak")

    # Update global.env
    cat > "$BUILD_ARGS_DIR/global.env" << EOF
# ===================================================================
# Global Docker Build Arguments - Used by all categories
# Source: docker/versions.toml
# Last updated: $(date -u +'%Y-%m-%d %H:%M:%S UTC')
# ===================================================================

# --- Build Tools ---
GRADLE_VERSION=$gradle_version
JAVA_VERSION=$java_version

# --- Build Metadata ---
BUILD_DATE=\$(date -u +'%Y-%m-%dT%H:%M:%SZ')
VERSION=$app_version

# --- Common Base Images ---
ALPINE_VERSION=$alpine_version
ECLIPSE_TEMURIN_JDK_VERSION=$java_version-jdk-alpine
ECLIPSE_TEMURIN_JRE_VERSION=$java_version-jre-alpine

# --- Monitoring & Infrastructure Services ---
DOCKER_PROMETHEUS_VERSION=$prometheus_version
DOCKER_GRAFANA_VERSION=$grafana_version
DOCKER_KEYCLOAK_VERSION=$keycloak_version
EOF
    print_success "Updated global.env"

    # Update clients.env
    cat > "$BUILD_ARGS_DIR/clients.env" << EOF
# ===================================================================
# Clients Docker Build Arguments - dockerfiles/clients/*
# Source: docker/versions.toml [categories.clients]
# Last updated: $(date -u +'%Y-%m-%d %H:%M:%S UTC')
# ===================================================================

# --- Include Global Arguments ---
# Source global.env for GRADLE_VERSION, JAVA_VERSION, BUILD_DATE, VERSION

# --- Client-Specific Build Tools ---
NODE_VERSION=$node_version
NGINX_VERSION=$nginx_version

# --- Client Build Configuration ---
CLIENT_PATH=client
CLIENT_MODULE=client
CLIENT_NAME=meldestelle-client

# --- Web Application Specific ---
WEB_APP_PORT=4000
WEB_APP_BUILD_TARGET=wasmJsBrowserDistribution

# --- Desktop Application Specific ---
DESKTOP_APP_VNC_PORT=5901
DESKTOP_APP_NOVNC_PORT=6080
DESKTOP_APP_BUILD_TARGET=composeDesktop

# --- Client Environment ---
NODE_ENV=production
APP_TITLE=Meldestelle
APP_VERSION=$app_version

# --- Development Configuration ---
WEBPACK_DEV_SERVER_HOST=0.0.0.0
WEBPACK_DEV_SERVER_PORT=4000
EOF
    print_success "Updated clients.env"

    # Update services.env
    cat > "$BUILD_ARGS_DIR/services.env" << EOF
# ===================================================================
# Services Docker Build Arguments - dockerfiles/services/*
# Source: docker/versions.toml [categories.services]
# Last updated: $(date -u +'%Y-%m-%d %H:%M:%S UTC')
# ===================================================================

# --- Include Global Arguments ---
# Source global.env for GRADLE_VERSION, JAVA_VERSION, BUILD_DATE, VERSION

# --- Spring Boot Services Configuration ---
SPRING_PROFILES_ACTIVE=$spring_docker

# --- Service-Specific Arguments ---
SERVICE_PATH=.
SERVICE_NAME=spring-boot-service
SERVICE_PORT=8080

# --- Service Port Mapping (matches gradle.properties) ---
PING_SERVICE_PORT=8082
MEMBERS_SERVICE_PORT=8083
HORSES_SERVICE_PORT=8084
EVENTS_SERVICE_PORT=8085
MASTERDATA_SERVICE_PORT=8086

# --- Services List (for automation scripts) ---
# ping-service, members-service, horses-service, events-service, masterdata-service
EOF
    print_success "Updated services.env"

    # Update infrastructure.env
    cat > "$BUILD_ARGS_DIR/infrastructure.env" << EOF
# ===================================================================
# Infrastructure Docker Build Arguments - dockerfiles/infrastructure/*
# Source: docker/versions.toml [categories.infrastructure]
# Last updated: $(date -u +'%Y-%m-%d %H:%M:%S UTC')
# ===================================================================

# --- Include Global Arguments ---
# Source global.env for GRADLE_VERSION, JAVA_VERSION, BUILD_DATE, VERSION

# --- Infrastructure Services Configuration ---
SPRING_PROFILES_ACTIVE=$spring_default

# --- Infrastructure Service Ports (matches gradle.properties) ---
GATEWAY_PORT=8081
AUTH_SERVER_PORT=8087
MONITORING_SERVER_PORT=8088

# --- API Gateway Specific ---
GATEWAY_SERVICE_PATH=infrastructure/gateway
GATEWAY_SERVICE_NAME=api-gateway

# --- Auth Server Specific ---
AUTH_SERVER_PATH=infrastructure/auth/auth-server
AUTH_SERVER_SERVICE_NAME=auth-server

# --- Monitoring Server Specific ---
MONITORING_SERVER_PATH=infrastructure/monitoring/monitoring-server
MONITORING_SERVER_SERVICE_NAME=monitoring-server

# --- Infrastructure Dependencies ---
CONSUL_ENABLED=true
CONSUL_HOST=consul
CONSUL_PORT=8500

# --- Database Configuration for Infrastructure Services ---
DB_HOST=postgres
DB_PORT=5432
DB_NAME=meldestelle
EOF
    print_success "Updated infrastructure.env"

    print_success "All environment files synced successfully!"
}

# Function to show current versions
show_current_versions() {
    print_info "Current Docker versions:"
    echo "  Gradle: $(get_version "gradle")"
    echo "  Java: $(get_version "java")"
    echo "  Node.js: $(get_version "node")"
    echo "  Nginx: $(get_version "nginx")"
    echo "  Alpine: $(get_version "alpine")"
    echo "  Prometheus: $(get_version "prometheus")"
    echo "  Grafana: $(get_version "grafana")"
    echo "  Keycloak: $(get_version "keycloak")"
    echo "  App Version: $(get_version "app-version")"
    echo "  Spring Profile (Default): $(get_version "spring-profiles-default")"
    echo "  Spring Profile (Docker): $(get_version "spring-profiles-docker")"
}

# Function to show help
show_help() {
    echo "Docker Versions Update Utility"
    echo ""
    echo "Usage: $0 [COMMAND] [OPTIONS]"
    echo ""
    echo "Commands:"
    echo "  show                         Show current versions"
    echo "  sync                         Sync versions.toml to environment files"
    echo "  update <key> <version>       Update specific version"
    echo ""
    echo "Available keys for update:"
    echo "  gradle                       Gradle version"
    echo "  java                         Java version"
    echo "  node                         Node.js version"
    echo "  nginx                        Nginx version"
    echo "  alpine                       Alpine Linux version"
    echo "  prometheus                   Prometheus version"
    echo "  grafana                      Grafana version"
    echo "  keycloak                     Keycloak version"
    echo "  app-version                  Application version"
    echo "  spring-profiles-default      Default Spring profile"
    echo "  spring-profiles-docker       Docker Spring profile"
    echo ""
    echo "Examples:"
    echo "  $0 show                      # Show current versions"
    echo "  $0 update gradle 9.1.0       # Update Gradle to 9.1.0"
    echo "  $0 update java 22            # Update Java to version 22"
    echo "  $0 sync                      # Sync versions to environment files"
    echo ""
    echo "After updating versions, run 'sync' to update environment files"
    echo "or use scripts/docker-build.sh to build with new versions."
}

# Main execution
main() {
    # Check if versions.toml exists
    if [[ ! -f "$VERSIONS_TOML" ]]; then
        print_error "Versions file not found: $VERSIONS_TOML"
        exit 1
    fi

    case $1 in
        "show")
            show_current_versions
            ;;
        "sync")
            sync_to_env_files
            ;;
        "update")
            if [[ $# -lt 3 ]]; then
                print_error "Usage: $0 update <key> <version>"
                exit 1
            fi
            update_version "$2" "$3"
            sync_to_env_files
            ;;
        "-h"|"--help"|"help")
            show_help
            ;;
        "")
            print_error "No command specified"
            show_help
            exit 1
            ;;
        *)
            print_error "Unknown command: $1"
            show_help
            exit 1
            ;;
    esac
}

# Run main function with all arguments
main "$@"
