#!/usr/bin/env bash
# =============================================================================
# BLOOM LIMS - Environment Activation Script
# =============================================================================

if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
    echo "Error: This script must be sourced, not executed."
    echo "Usage: source ./activate <deploy-name>"
    exit 1
fi

_bloom_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
}

_BLOOM_SCRIPT_PATH="$(_bloom_script_path)"
BLOOM_ROOT="$(cd "$(dirname "${_BLOOM_SCRIPT_PATH}")" && pwd)"
unset -f _bloom_script_path
unset _BLOOM_SCRIPT_PATH

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

if [[ "$#" -ne 1 ]]; then
    echo -e "  ${_YELLOW}⚠${_NC} Bloom activation requires exactly one positional deploy-name."
    echo "Usage: source ./activate <deploy-name>"
    return 1
fi

_BLOOM_DEPLOYMENT_CODE="$1"
if [[ ! "$_BLOOM_DEPLOYMENT_CODE" =~ ^[A-Za-z0-9-]{2,8}$ ]]; then
    echo -e "  ${_YELLOW}⚠${_NC} deploy-name must match ^[A-Za-z0-9-]{2,8}$"
    return 1
fi
_BLOOM_CONDA_ENV_BASE="BLOOM"
_BLOOM_CONDA_ENV_NAME="${_BLOOM_CONDA_ENV_BASE}-${_BLOOM_DEPLOYMENT_CODE}"
_BLOOM_CONDA_ENV_CREATED="0"
unset _BLOOM_DEPLOYMENT_CODE

echo -e "${_BLUE}Activating BLOOM LIMS environment (${_BLOOM_CONDA_ENV_NAME})...${_NC}"

if ! command -v conda &> /dev/null; then
    echo -e "  ${_YELLOW}⚠${_NC} Conda not found."
    return 1
fi

if [[ -n "${ZSH_VERSION:-}" ]]; then
    eval "$(conda shell.zsh hook)" 2>/dev/null || true
elif [[ -n "${BASH_VERSION:-}" ]]; then
    eval "$(conda shell.bash hook)" 2>/dev/null || true
else
    source "$(conda info --base)/etc/profile.d/conda.sh" 2>/dev/null || true
fi

if conda info --envs | grep -Eq "(^|[[:space:]])${_BLOOM_CONDA_ENV_NAME}([[:space:]]|$)"; then
    echo -e "  ${_GREEN}✓${_NC} Activating conda environment: ${_BLOOM_CONDA_ENV_NAME}"
    conda activate "${_BLOOM_CONDA_ENV_NAME}"
else
    echo -e "  ${_YELLOW}⚠${_NC} Conda environment '${_BLOOM_CONDA_ENV_NAME}' not found."
    if [[ -f "$BLOOM_ROOT/environment.yaml" ]]; then
        echo -e "  ${_CYAN}→${_NC} Installing conda environment from environment.yaml..."
        if conda env create -n "${_BLOOM_CONDA_ENV_NAME}" -f "$BLOOM_ROOT/environment.yaml"; then
            echo -e "  ${_GREEN}✓${_NC} Conda environment created successfully"
            conda activate "${_BLOOM_CONDA_ENV_NAME}"
            _BLOOM_CONDA_ENV_CREATED="1"
        else
            echo -e "  ${_YELLOW}⚠${_NC} Failed to create conda environment."
            return 1
        fi
    else
        echo -e "  ${_YELLOW}⚠${_NC} environment.yaml not found."
        return 1
    fi
fi

if [[ "${CONDA_DEFAULT_ENV:-}" != "${_BLOOM_CONDA_ENV_NAME}" ]] || [[ -z "${CONDA_PREFIX:-}" ]] || [[ ! -x "${CONDA_PREFIX}/bin/python" ]]; then
    echo -e "  ${_YELLOW}⚠${_NC} ${_BLOOM_CONDA_ENV_NAME} conda environment is required."
    echo -e "  ${_CYAN}→${_NC} Run 'conda env create -n ${_BLOOM_CONDA_ENV_NAME} -f environment.yaml' if needed, then retry 'source ./activate <deploy-name>'."
    return 1
fi

export PATH="${CONDA_PREFIX}/bin:${PATH}"

if [[ "${_BLOOM_CONDA_ENV_CREATED}" == "1" ]]; then
    echo -e "  ${_CYAN}→${_NC} Installing editable Bloom package into ${_BLOOM_CONDA_ENV_NAME}..."
    if ! "${CONDA_PREFIX}/bin/python" -m pip install -e "$BLOOM_ROOT"; then
        echo -e "  ${_YELLOW}⚠${_NC} Failed to install local Bloom checkout from ${BLOOM_ROOT}"
        return 1
    fi
fi

export BLOOM_ROOT
export BLOOM_ACTIVE=1

if command -v rehash >/dev/null 2>&1; then
    rehash
elif command -v hash >/dev/null 2>&1; then
    hash -r 2>/dev/null || true
fi

echo -e "  ${_GREEN}✓${_NC} Using BLOOM checkout: ${BLOOM_ROOT}"
echo -e "  ${_GREEN}✓${_NC} Active conda environment: ${CONDA_DEFAULT_ENV}"
echo -e "  ${_GREEN}✓${_NC} Repo CLI entrypoints are provided by the activated environment"
echo ""
echo -e "${_CYAN}BLOOM LIMS environment activated!${_NC}"
