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

LIB_DIR="/usr/lib/easydcim-control"
CONFIG_FILE="/etc/easydcim-control/config"

# Load shared functions
source "$LIB_DIR/common/functions.sh"

# Load config (overrides defaults)
[ -f "$CONFIG_FILE" ] && source "$CONFIG_FILE"

#-------------------------------------------------------
# Global flags — strip before routing
#-------------------------------------------------------
_NO_UPDATE=0
_CLEAN_ARGS=()
for _arg in "$@"; do
    case "$_arg" in
        --no-update) _NO_UPDATE=1 ;;
        *)           _CLEAN_ARGS+=("$_arg") ;;
    esac
done
set -- "${_CLEAN_ARGS[@]+"${_CLEAN_ARGS[@]}"}"
unset _arg _CLEAN_ARGS

#-------------------------------------------------------
# Auto-update check
#-------------------------------------------------------
_apt_update_easydcim() {
    # Refresh only the easydcim repository (not all sources)
    local sources_file=""
    for f in /etc/apt/sources.list.d/easydcim*.list \
              /etc/apt/sources.list.d/easydcim*.sources; do
        [ -f "$f" ] && sources_file="$f" && break
    done

    if [ -n "$sources_file" ]; then
        apt-get update -qq \
            -o Dir::Etc::sourcelist="$sources_file" \
            -o Dir::Etc::sourceparts="-" \
            -o APT::Get::List-Cleanup="0" \
            2>/dev/null || true
    else
        apt-get update -qq 2>/dev/null || true
    fi
}

_check_for_update() {
    [ "${EASYDCIM_UPDATED:-}" = "1" ] && return 0
    [ "$_NO_UPDATE" = "1" ] && return 0

    command -v dpkg-query >/dev/null 2>&1 || return 0
    command -v apt-cache  >/dev/null 2>&1 || return 0

    local installed candidate
    installed=$(dpkg-query -W -f='${Version}' easydcim-control 2>/dev/null) || return 0
    [ -z "$installed" ] && return 0

    candidate=$(apt-cache policy easydcim-control 2>/dev/null \
        | awk '/Candidate:/{print $2; exit}') || return 0
    [ -z "$candidate" ] || [ "$candidate" = "(none)" ] && return 0

    dpkg --compare-versions "$candidate" gt "$installed" 2>/dev/null || return 0

    echo "Updating easydcim-control: ${installed} → ${candidate}"
    if apt-get install --only-upgrade -y easydcim-control 2>/dev/null; then
        echo ""
        export EASYDCIM_UPDATED=1
        exec easydcim-control "$@"
    else
        echo "Update failed. Continuing with current version." >&2
    fi
}

_check_for_update "$@"

#-------------------------------------------------------
# Help
#-------------------------------------------------------
show_help() {
    local version
    version=$(cat "$LIB_DIR/.version" 2>/dev/null || echo "dev")

    print_banner "easydcim-control v${version}"
    cat <<EOF
Usage:
  easydcim-control <component> <action> [options]

Components:
  app         EasyDCIM application management
  agent       Remote Agent management
  client      Client Area management

Global commands:
  version     Show version
  upgrade     Update easydcim-control package via APT
  socket      Configure systemd socket for communication
  help        Show this help

App commands:
  easydcim-control app install [options]      Install EasyDCIM (Docker)
  easydcim-control app up                     Start containers
  easydcim-control app down                   Stop containers
  easydcim-control app restart                Restart containers (down + up)
  easydcim-control app update [options]       Update application
  easydcim-control app uninstall              Remove application
  easydcim-control app status                 Show container status
  easydcim-control app logs [options]         View logs
  easydcim-control app shell [target]         Open shell in container
  easydcim-control app ssl [subcommand]       SSL certificate management
  easydcim-control app migrate [options]      Migrate host app to Docker
  easydcim-control app backup                 Create backup
  easydcim-control app restore <file>         Restore from backup

Agent commands:
  easydcim-control agent install [options]    Install Remote Agent
  easydcim-control agent up                   Start containers
  easydcim-control agent down                 Stop containers
  easydcim-control agent restart              Restart containers (down + up)
  easydcim-control agent update [options]     Update agent version
  easydcim-control agent uninstall            Remove agent
  easydcim-control agent status               Show container status
  easydcim-control agent logs [options]       View logs
  easydcim-control agent ssh:regenerate       Regenerate SSH keys
  easydcim-control agent shell [target]       Open shell in container
  easydcim-control agent migrate [options]    Migrate host agent to Docker
  easydcim-control agent backup               Create backup
  easydcim-control agent restore <file>       Restore from backup

Client Area commands:
  easydcim-control client install [options]   Install Client Area
  easydcim-control client up                  Start container
  easydcim-control client down                Stop container
  easydcim-control client restart             Restart container
  easydcim-control client update [options]    Update Client Area
  easydcim-control client uninstall           Remove Client Area
  easydcim-control client status              Show container status
  easydcim-control client logs [options]      View logs
  easydcim-control client ssl [subcommand]    SSL certificate management
  easydcim-control client config set <key> <value>  Change configuration

Run 'easydcim-control <component> help' for details.
EOF
}

app_help() {
    cat <<EOF
easydcim-control app — EasyDCIM Application Management

Installation:
  easydcim-control app install \\
    --key "LICENSE_KEY" \\
    --version "2.0.0" \\
    --image-tag "latest" \\
    --db-pass "PASSWORD"

  Options:
    -k,  --key           License key (required for install)
    -v,  --version       Application version (default: latest)
    --image-tag          Docker image tag (default: latest)
    --db-pass            Database password (default: auto-generated)

Migration:
  easydcim-control app migrate               Migrate host-installed app to Docker
  easydcim-control app migrate --force       Skip confirmation prompt
  easydcim-control app migrate --help        Show migration options

Lifecycle:
  easydcim-control app up                    Start all containers
  easydcim-control app down                  Stop all containers
  easydcim-control app restart               Restart all containers (down + up)
  easydcim-control app update --version X    Update to version X [--image-tag TAG]
  easydcim-control app uninstall             Remove application (with confirmation)

Diagnostics:
  easydcim-control app status                Container status, ports, health
  easydcim-control app logs                  App container logs (last 100 lines)
  easydcim-control app logs --follow         Follow app logs
  easydcim-control app logs db               MariaDB container logs
  easydcim-control app logs app              Application logs (Laravel)

Shell:
  easydcim-control app shell                 Open bash in app container (default)
  easydcim-control app shell app             Open bash in app container
  easydcim-control app shell db              Open MariaDB terminal
  easydcim-control app shell redis           Open redis-cli (data)
  easydcim-control app shell redis-cache     Open redis-cli (cache)
  easydcim-control app shell -- <cmd>        Run command in app container

SSL:
  easydcim-control app ssl install <fullchain> <privkey>   Custom (paid) SSL certificate
  easydcim-control app ssl letsencrypt install <domain>    Free Let's Encrypt certificate
  easydcim-control app ssl letsencrypt renew               Renew Let's Encrypt certificates
  easydcim-control app ssl letsencrypt remove              Remove LE, restore self-signed

Backup:
  easydcim-control app backup                Backup env, keys, certs, database
  easydcim-control app restore <file>        Restore from backup archive

InfluxDB:
  influxdb          Manage InfluxDB Tasks
  easydcim-control app influxdb provision    Create/update InfluxDB downsampling Flux Tasks
  migrate-rrd       Migrate historical RRD data to InfluxDB

Grafana:
  easydcim-control app grafana provision       Set up Grafana data source and dashboards
  easydcim-control app grafana credentials     Show Grafana admin credentials

Paths:
  Docker directory:      ${APP_DOCKER_DIR:-/opt/easydcim_docker/easydcim}
  Application directory: ${APP_DIR:-/opt/easydcim}
EOF
}

agent_help() {
    cat <<EOF
easydcim-control agent — Remote Agent Management

Installation:
  easydcim-control agent install \\
    --version "2.0.0" \\
    --image-tag "latest" \\
    --app-url "https://easydcim.example.com" \\
    --app-apikey "API_KEY" \\
    --app-token "TOKEN" \\
    --db-pass "PASSWORD"

  Options:
    -v,  --version       Application version (default: latest)
    --image-tag          Docker image tag (default: latest)
    --app-url            Main EasyDCIM server URL
    --app-apikey         API key for agent registration
    --app-token          Installation progress token
    --db-pass            Database password (default: auto-generated)

Migration:
  easydcim-control agent migrate              Migrate host-installed agent to Docker
  easydcim-control agent migrate --force      Skip confirmation prompt
  easydcim-control agent migrate --help       Show migration options

Lifecycle:
  easydcim-control agent up                   Start all containers
  easydcim-control agent down                 Stop all containers
  easydcim-control agent restart              Restart all containers (down + up)
  easydcim-control agent update --version X   Update to version X [--image-tag TAG]
  easydcim-control agent uninstall            Remove agent (with confirmation)

Diagnostics:
  easydcim-control agent status               Container status, ports, health
  easydcim-control agent logs                 Agent container logs (last 100 lines)
  easydcim-control agent logs --follow        Follow agent logs
  easydcim-control agent logs db              MariaDB container logs
  easydcim-control agent logs app             Application logs (Laravel)

SSH:
  easydcim-control agent ssh:regenerate       Regenerate SSH keys

Shell:
  easydcim-control agent shell                Open bash in agent container (default)
  easydcim-control agent shell agent          Open bash in agent container
  easydcim-control agent shell db             Open MariaDB terminal
  easydcim-control agent shell redis          Open redis-cli terminal
  easydcim-control agent shell -- <cmd>       Run command in agent container

Debug:
  easydcim-control agent debug enable         Enable debug mode
  easydcim-control agent debug disable        Disable debug mode

Backup:
  easydcim-control agent backup               Backup env, keys, certs, database
  easydcim-control agent restore <file>       Restore from backup archive

Paths:
  Docker directory:     ${AGENT_DOCKER_DIR:-/opt/easydcim_docker/agent}
  Application directory: ${AGENT_APP_DIR:-/opt/easydcim_remote}
EOF
}

client_help() {
    cat <<EOF
easydcim-control client — Client Area Management

Installation:
  easydcim-control client install \\
    --version "2.0.0" \\
    --backend-url "https://easydcim.example.com" \\
    --app-token "TOKEN" \\
    --mode "local"

  Options:
    -v,  --version       Application version (default: latest)
    --backend-url        EasyDCIM backend URL (default: auto-detect)
    --app-token          API token (default: auto-generated from EasyDCIM)
    --mode               Installation mode: local or external (default: local)

Lifecycle:
  easydcim-control client up                   Start container
  easydcim-control client down                 Stop container
  easydcim-control client restart              Restart container
  easydcim-control client update --version X   Update to version X
  easydcim-control client uninstall            Remove Client Area

Diagnostics:
  easydcim-control client status               Container status
  easydcim-control client logs                 Container logs (last 100 lines)
  easydcim-control client logs --follow        Follow container logs

SSL:
  easydcim-control client ssl install <fullchain> <privkey>   Custom SSL certificate
  easydcim-control client ssl letsencrypt install <domain>    Request Let's Encrypt cert
  easydcim-control client ssl letsencrypt renew               Renew Let's Encrypt certs
  easydcim-control client ssl letsencrypt remove              Remove LE, restore self-signed

Configuration:
  easydcim-control client config set backend-url <url>        Set EasyDCIM backend URL

Paths:
  Application directory: ${CLIENT_DIR:-/opt/easydcim_client}
EOF
}

#-------------------------------------------------------
# Routing
#-------------------------------------------------------
COMPONENT="${1:-}"
ACTION="${2:-}"
shift 2 2>/dev/null || true

case "$COMPONENT" in
    app)
        setup_logging
        case "$ACTION" in
            install)
                source "$LIB_DIR/app/install.sh"
                app_install "$@"
                ;;
            up|start)
                source "$LIB_DIR/app/up.sh"
                app_up "$@"
                ;;
            down|stop)
                source "$LIB_DIR/app/down.sh"
                app_down "$@"
                ;;
            restart)
                source "$LIB_DIR/app/restart.sh"
                app_restart "$@"
                ;;
            update|upgrade)
                source "$LIB_DIR/app/update.sh"
                app_update "$@"
                ;;
            uninstall|remove)
                source "$LIB_DIR/app/uninstall.sh"
                app_uninstall "$@"
                ;;
            status)
                source "$LIB_DIR/app/status.sh"
                app_status "$@"
                ;;
            logs|log)
                source "$LIB_DIR/app/logs.sh"
                app_logs "$@"
                ;;
            shell|sh|exec)
                source "$LIB_DIR/app/shell.sh"
                app_shell "$@"
                ;;
            backup)
                source "$LIB_DIR/app/backup.sh"
                app_backup "$@"
                ;;
            restore)
                source "$LIB_DIR/app/backup.sh"
                app_restore "$@"
                ;;
            migrate)
                source "$LIB_DIR/app/migrate.sh"
                app_migrate "$@"
                ;;
            dev)
                source "$LIB_DIR/app/dev.sh"
                app_dev "$@"
                ;;
            ssl)
                source "$LIB_DIR/app/ssl.sh"
                app_ssl "$@"
                ;;
            influxdb)
                source "$LIB_DIR/app/influxdb.sh"
                app_influxdb "$@"
                ;;
            grafana)
                source "$LIB_DIR/app/grafana.sh"
                app_grafana "$@"
                ;;
            help|--help|-h|"")
                app_help
                ;;
            *)
                echo_error "Unknown action: $ACTION. Run 'easydcim-control app help' for usage."
                ;;
        esac
        ;;
    agent)
        setup_logging
        case "$ACTION" in
            install)
                source "$LIB_DIR/agent/install.sh"
                agent_install "$@"
                ;;
            up|start)
                source "$LIB_DIR/agent/up.sh"
                agent_up "$@"
                ;;
            down|stop)
                source "$LIB_DIR/agent/down.sh"
                agent_down "$@"
                ;;
            restart)
                source "$LIB_DIR/agent/restart.sh"
                agent_restart "$@"
                ;;
            update|upgrade)
                source "$LIB_DIR/agent/update.sh"
                agent_update "$@"
                ;;
            uninstall|remove)
                source "$LIB_DIR/agent/uninstall.sh"
                agent_uninstall "$@"
                ;;
            status)
                source "$LIB_DIR/agent/status.sh"
                agent_status "$@"
                ;;
            logs|log)
                source "$LIB_DIR/agent/logs.sh"
                agent_logs "$@"
                ;;
            ssh:regenerate)
                source "$LIB_DIR/agent/ssh.sh"
                agent_ssh_regenerate "$@"
                ;;
            shell|sh|exec)
                source "$LIB_DIR/agent/shell.sh"
                agent_shell "$@"
                ;;
            backup)
                source "$LIB_DIR/agent/backup.sh"
                agent_backup "$@"
                ;;
            restore)
                source "$LIB_DIR/agent/backup.sh"
                agent_restore "$@"
                ;;
            migrate)
                source "$LIB_DIR/agent/migrate.sh"
                agent_migrate "$@"
                ;;
            debug)
                source "$LIB_DIR/agent/debug.sh"
                agent_debug "$@"
                ;;
            dev)
                source "$LIB_DIR/agent/dev.sh"
                agent_dev "$@"
                ;;
            help|--help|-h|"")
                agent_help
                ;;
            *)
                echo_error "Unknown action: $ACTION. Run 'easydcim-control agent help' for usage."
                ;;
        esac
        ;;
    client)
        setup_logging
        case "$ACTION" in
            install)
                source "$LIB_DIR/client/install.sh"
                client_install "$@"
                ;;
            up|start)
                source "$LIB_DIR/client/up.sh"
                client_up "$@"
                ;;
            down|stop)
                source "$LIB_DIR/client/down.sh"
                client_down "$@"
                ;;
            restart)
                source "$LIB_DIR/client/restart.sh"
                client_restart "$@"
                ;;
            update|upgrade)
                source "$LIB_DIR/client/update.sh"
                client_update "$@"
                ;;
            uninstall|remove)
                source "$LIB_DIR/client/uninstall.sh"
                client_uninstall "$@"
                ;;
            status)
                source "$LIB_DIR/client/status.sh"
                client_status "$@"
                ;;
            logs|log)
                source "$LIB_DIR/client/logs.sh"
                client_logs "$@"
                ;;
            dev)
                source "$LIB_DIR/client/dev.sh"
                client_dev "$@"
                ;;
            ssl)
                source "$LIB_DIR/client/ssl.sh"
                client_ssl "$@"
                ;;
            config)
                source "$LIB_DIR/client/config.sh"
                client_config "$@"
                ;;
            help|--help|-h|"")
                client_help
                ;;
            *)
                echo_error "Unknown action: $ACTION. Run 'easydcim-control client help' for usage."
                ;;
        esac
        ;;
    upgrade)
        INSTALLED=$(dpkg-query -W -f='${Version}' easydcim-control 2>/dev/null || echo "unknown")
        echo "Upgrading easydcim-control (installed: ${INSTALLED})..."
        _apt_update_easydcim
        apt-get install --only-upgrade -y easydcim-control \
        || { echo "Upgrade failed." >&2; exit 1; }
        NEW=$(dpkg-query -W -f='${Version}' easydcim-control 2>/dev/null || echo "unknown")
        echo "Done: ${INSTALLED} → ${NEW}"
        ;;
    version|--version|-v)
        setup_logging
        version=$(cat "$LIB_DIR/.version" 2>/dev/null || echo "dev")
        print_banner "easydcim-control v${version}"
        ;;
    socket)
        setup_logging
        source "$LIB_DIR/common/socket.sh"
        socket_configure "$@"
        ;;
    help|--help|-h|"")
        show_help
        ;;
    *)
        echo_error "Unknown component: $COMPONENT. Available: app, agent, client"
        ;;
esac
