#!/usr/bin/env bash
# LSMC Atlas - Environment Activation Script
# ==========================================
#
# Source this script from the repository root:
#   source atlas_activate
#
# What it does:
#   1. Activates LSMC_ATLAS conda environment (if available)
#   2. Installs atlas CLI in editable mode (if needed)
#   3. Enables atlas shell completion
#   4. Exports TapDB/AWS defaults for Atlas runtime

if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
    echo "Error: This script must be sourced, not executed."
    echo "Usage: source atlas_activate"
    exit 1
fi

_atlas_script_path() {
    if [[ -n "${ZSH_VERSION:-}" ]]; then
        printf '%s\n' "${(%):-%x}"
    elif [[ -n "${BASH_SOURCE[0]:-}" ]]; then
        printf '%s\n' "${BASH_SOURCE[0]}"
    else
        printf '%s\n' "$0"
    fi
}

_ATLAS_SCRIPT_PATH="$(_atlas_script_path)"
LSMC_ATLAS_ROOT="$(cd "$(dirname "${_ATLAS_SCRIPT_PATH}")" && pwd)"
unset -f _atlas_script_path
unset _ATLAS_SCRIPT_PATH

_GREEN='\033[0;32m'
_YELLOW='\033[1;33m'
_BLUE='\033[0;34m'
_CYAN='\033[0;36m'
_NC='\033[0m'
_ATLAS_PYTHON=""
_ATLAS_ENV_NAME="LSMC_ATLAS"

_atlas_activation_fail() {
    echo -e "  ${_YELLOW}✗${_NC} $1"
    echo -e "     Atlas requires conda environment: ${_CYAN}${_ATLAS_ENV_NAME}${_NC}"
    echo -e "     CONDA_DEFAULT_ENV=${CONDA_DEFAULT_ENV:-<unset>}"
    echo -e "     CONDA_PREFIX=${CONDA_PREFIX:-<unset>}"
}

echo -e "${_BLUE}Activating LSMC Atlas environment...${_NC}"

# 1. Activate conda environment (install if needed)
if command -v conda &> /dev/null; then
    source "$(conda info --base)/etc/profile.d/conda.sh" 2>/dev/null || true

    if conda info --envs | grep -q "${_ATLAS_ENV_NAME}"; then
        echo -e "  ${_GREEN}✓${_NC} Activating conda environment: ${_ATLAS_ENV_NAME}"
        if ! conda activate "${_ATLAS_ENV_NAME}"; then
            echo -e "  ${_YELLOW}⚠${_NC} Failed to activate conda environment: ${_ATLAS_ENV_NAME}."
        fi
        if [[ -n "${CONDA_PREFIX:-}" ]] && [[ -d "${CONDA_PREFIX}/bin" ]]; then
            export PATH="${CONDA_PREFIX}/bin:$PATH"
        fi
    else
        echo -e "  ${_YELLOW}⚠${_NC} Conda environment '${_ATLAS_ENV_NAME}' not found."
        if [[ -f "$LSMC_ATLAS_ROOT/atlas_env.yaml" ]]; then
            echo -e "  ${_CYAN}→${_NC} Installing conda environment from atlas_env.yaml..."
            if conda env create -f "$LSMC_ATLAS_ROOT/atlas_env.yaml"; then
                echo -e "  ${_GREEN}✓${_NC} Activating conda environment: ${_ATLAS_ENV_NAME}"
                if ! conda activate "${_ATLAS_ENV_NAME}"; then
                    echo -e "  ${_YELLOW}⚠${_NC} Failed to activate conda environment: ${_ATLAS_ENV_NAME}."
                fi
                if [[ -n "${CONDA_PREFIX:-}" ]] && [[ -d "${CONDA_PREFIX}/bin" ]]; then
                    export PATH="${CONDA_PREFIX}/bin:$PATH"
                fi
            else
                echo -e "  ${_YELLOW}⚠${_NC} Failed to create conda environment."
            fi
        fi
    fi
else
    echo -e "  ${_YELLOW}⚠${_NC} Conda not found. Ensure dependencies are installed."
fi

_ATLAS_CONDA_PREFIX_BASENAME=""
if [[ -n "${CONDA_PREFIX:-}" ]]; then
    _ATLAS_CONDA_PREFIX_BASENAME="$(basename "${CONDA_PREFIX}")"
fi

if [[ "${CONDA_DEFAULT_ENV:-}" != "${_ATLAS_ENV_NAME}" ]] || [[ -z "${CONDA_PREFIX:-}" ]] || [[ "${_ATLAS_CONDA_PREFIX_BASENAME}" != "${_ATLAS_ENV_NAME}" ]] || [[ ! -x "${CONDA_PREFIX}/bin/python" ]]; then
    _atlas_activation_fail "Atlas activation did not select the expected conda environment."
    unset _ATLAS_CONDA_PREFIX_BASENAME
    return 1
fi
unset _ATLAS_CONDA_PREFIX_BASENAME

# Ensure the active environment's bin directory wins over any stale global CLI.
if [[ -n "${CONDA_PREFIX:-}" ]] && [[ -x "${CONDA_PREFIX}/bin/python" ]]; then
    _ATLAS_PYTHON="${CONDA_PREFIX}/bin/python"
elif command -v python3 &> /dev/null; then
    _ATLAS_PYTHON="$(command -v python3)"
elif command -v python &> /dev/null; then
    _ATLAS_PYTHON="$(command -v python)"
fi

if [[ -n "${_ATLAS_PYTHON}" ]]; then
    _ATLAS_PYTHON_BIN="$(dirname "${_ATLAS_PYTHON}")"
    _ATLAS_SCRIPTS_DIR="$("${_ATLAS_PYTHON}" -c 'import sysconfig; print(sysconfig.get_path("scripts") or "")' 2>/dev/null || true)"
    if [[ -n "${_ATLAS_SCRIPTS_DIR}" ]] && [[ -d "${_ATLAS_SCRIPTS_DIR}" ]]; then
        export PATH="${_ATLAS_SCRIPTS_DIR}:$PATH"
    fi
    if [[ -d "${_ATLAS_PYTHON_BIN}" ]]; then
        export PATH="${_ATLAS_PYTHON_BIN}:$PATH"
    fi
fi

# 2. Install CLI in editable mode if not already installed
if ! "${_ATLAS_PYTHON:-python}" -m pip show lsmc-atlas &> /dev/null 2>&1; then
    echo -e "  ${_CYAN}→${_NC} Installing atlas CLI..."
    "${_ATLAS_PYTHON:-python}" -m pip install -e "$LSMC_ATLAS_ROOT" -q
    echo -e "  ${_GREEN}✓${_NC} Installed 'atlas' CLI command"
else
    echo -e "  ${_GREEN}✓${_NC} 'atlas' CLI already installed"
fi

if [[ -n "${_ATLAS_PYTHON}" ]]; then
    atlas() {
        "${_ATLAS_PYTHON}" -c 'from app.cli import main; main()' "$@"
    }
fi

# 3. Enable tab completion for interactive shells only.
if [[ "$-" == *i* ]]; then
    if [[ -n "${ZSH_VERSION:-}" ]]; then
        if _ATLAS_COMPLETION="$(atlas --show-completion zsh 2>/dev/null)" && eval "${_ATLAS_COMPLETION}" 2>/dev/null; then
            echo -e "  ${_GREEN}✓${_NC} Enabled tab completion for 'atlas' (zsh)"
        fi
        unset _ATLAS_COMPLETION
    elif [[ -n "${BASH_VERSION:-}" ]]; then
        if _ATLAS_COMPLETION="$(atlas --show-completion bash 2>/dev/null)" && eval "${_ATLAS_COMPLETION}" 2>/dev/null; then
            echo -e "  ${_GREEN}✓${_NC} Enabled tab completion for 'atlas' (bash)"
        fi
        unset _ATLAS_COMPLETION
    fi
fi

# 4. Export Atlas/TapDB defaults
export LSMC_ATLAS_ROOT
export AWS_PROFILE="${AWS_PROFILE:-lsmc}"
export AWS_REGION="${AWS_REGION:-us-west-2}"
export DATABASE_BACKEND="${DATABASE_BACKEND:-tapdb}"
export DATABASE_TARGET="${DATABASE_TARGET:-local}"
export TAPDB_ENV="${TAPDB_ENV:-dev}"
export TAPDB_CLIENT_ID="${TAPDB_CLIENT_ID:-atlas}"
export TAPDB_DATABASE_NAME="${TAPDB_DATABASE_NAME:-lsmc-atlas}"
_ATLAS_DEFAULT_TAPDB_CONFIG_PATH="$LSMC_ATLAS_ROOT/config/tapdb-config-${TAPDB_DATABASE_NAME}.yaml"
export TAPDB_CONFIG_PATH="${TAPDB_CONFIG_PATH:-$_ATLAS_DEFAULT_TAPDB_CONFIG_PATH}"
export TAPDB_STRICT_NAMESPACE="${TAPDB_STRICT_NAMESPACE:-1}"

echo -e "  ${_GREEN}✓${_NC} AWS_PROFILE=${AWS_PROFILE}"
echo -e "  ${_GREEN}✓${_NC} AWS_REGION=${AWS_REGION}"
echo -e "  ${_GREEN}✓${_NC} TAPDB_CLIENT_ID=${TAPDB_CLIENT_ID}"
echo -e "  ${_GREEN}✓${_NC} TAPDB_DATABASE_NAME=${TAPDB_DATABASE_NAME}"
echo -e "  ${_GREEN}✓${_NC} TAPDB_ENV=${TAPDB_ENV}"
echo -e "  ${_GREEN}✓${_NC} TAPDB_STRICT_NAMESPACE=${TAPDB_STRICT_NAMESPACE}"
echo -e "  ${_GREEN}✓${_NC} TAPDB_CONFIG_PATH=${TAPDB_CONFIG_PATH}"

if [[ ! -f "$TAPDB_CONFIG_PATH" ]]; then
    echo -e "  ${_YELLOW}⚠${_NC} TapDB scoped config not found at ${TAPDB_CONFIG_PATH}"
    echo -e "     Create this file to avoid fallback to unrelated TapDB configs."
fi

if [[ -n "${DATABASE_URL:-}" ]]; then
    echo -e "  ${_GREEN}✓${_NC} DATABASE_URL already set"
else
    echo -e "  ${_CYAN}→${_NC} DATABASE_URL is resolved at runtime from tapdb config"
    echo -e "     Use ${_CYAN}atlas db build --target local${_NC} to bootstrap local runtime"
fi

# 5. Check for config file
CONFIG_DIR="${XDG_CONFIG_HOME:-$HOME/.config}/lsmc-atlas"
CONFIG_FILE="$CONFIG_DIR/config.yaml"
if [[ -f "$CONFIG_FILE" ]]; then
    echo -e "  ${_GREEN}✓${_NC} Config file: $CONFIG_FILE"
else
    echo -e "  ${_YELLOW}⚠${_NC} Config file not found: $CONFIG_FILE"
    echo -e "     Run ${_CYAN}atlas config init${_NC} to create it"
fi

# 6. Create deactivate function
atlas_deactivate() {
    unset LSMC_ATLAS_ROOT
    unset DATABASE_URL

    if [[ "$CONDA_DEFAULT_ENV" == "${_ATLAS_ENV_NAME}" ]]; then
        conda deactivate 2>/dev/null
    fi

    echo "LSMC Atlas environment deactivated."
    unset -f atlas_deactivate
}

echo ""
echo -e "${_CYAN}LSMC Atlas environment activated!${_NC}"
echo ""

echo "Command groups:"
echo ""
echo -e "  ${_CYAN}atlas server${_NC}    start, stop, status, logs, restart, worker"
echo -e "  ${_CYAN}atlas db${_NC}        build, seed, reset, nuke"
echo -e "  ${_CYAN}atlas tapdb${_NC}     bootstrap, db, pg, aurora"
echo -e "  ${_CYAN}atlas test${_NC}      run, all, db, cov, watch"
echo -e "  ${_CYAN}atlas quality${_NC}   lint, format, typecheck, check, templates"
echo -e "  ${_CYAN}atlas users${_NC}     list, groups, make-admin, remove-admin, create, info"
echo -e "  ${_CYAN}atlas cognito${_NC}   build, setup-with-google, status, add-user, set-password, list-apps, add-app, edit-app, remove-app, add-google-idp, delete"
echo -e "  ${_CYAN}atlas config${_NC}    path, init, show, validate, edit, reset, clean, shell, routes, status"
echo -e "  ${_CYAN}atlas env${_NC}       status, activate, deactivate, reset"
echo -e "  ${_CYAN}atlas certs${_NC}     install, create, status"
echo ""
echo -e "  ${_GREEN}atlas version${_NC}           Show version"
echo -e "  ${_GREEN}atlas info${_NC}              Show system info"
echo -e "  ${_GREEN}atlas --help${_NC}            Show all available commands"
echo -e "  ${_GREEN}atlas_deactivate${_NC}        Deactivate this environment"
echo ""
