#!/usr/bin/env bash
# ╔═══════════════════════════════════════════════════════╗
# ║   NexaCore AI VPS — Ollama Template v1.0.0           ║
# ╚═══════════════════════════════════════════════════════╝
# Usage:
#   bash <(curl -s https://templates.nexacore.cl/v1/ollama/install.sh)
#   Optional: PULL_MODEL=llama3 to pull a model after install
set -euo pipefail

VERSION="1.0.0"
TEMPLATE_NAME="Ollama LLM Server"
SERVICE_NAME="ollama"
DEFAULT_PORT="11434"

SCRIPTS_URL="${NEXACORE_SCRIPTS_URL:-https://templates.nexacore.cl/scripts/common}"
_LOCAL_SCRIPTS="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/../../.."

source_lib() {
  local lib="$1"
  local local_path="${_LOCAL_SCRIPTS}/scripts/common/${lib}"
  if [[ -f "$local_path" ]]; then source "$local_path"
  else source <(curl -fsSL "${SCRIPTS_URL}/${lib}") || { echo "[✘] Failed: ${lib}"; exit 1; }
  fi
}

source_lib utils.sh
source_lib setup_firewall.sh
source_lib setup_fail2ban.sh
source_lib setup_ssh.sh
source_lib setup_directories.sh
source_lib setup_logging.sh

PULL_MODEL="${PULL_MODEL:-}"
APP_DIR="${NEXACORE_BASE_DIR}/apps/${SERVICE_NAME}"
export NEXACORE_LOG_FILE="${NEXACORE_LOG_DIR}/install-${SERVICE_NAME}.log"

install_ollama() {
  if has_cmd ollama; then
    info "Ollama already installed"
    return 0
  fi
  step "Installing Ollama..."
  curl -fsSL https://ollama.ai/install.sh | bash >> "$NEXACORE_LOG_FILE" 2>&1
  systemctl enable --now ollama >> "$NEXACORE_LOG_FILE" 2>&1
  info "Ollama installed and running on port ${DEFAULT_PORT}"
}

configure_ollama_service() {
  # Bind Ollama to all interfaces so Open WebUI (Docker) can reach it
  mkdir -p /etc/systemd/system/ollama.service.d
  cat > /etc/systemd/system/ollama.service.d/override.conf <<EOF
[Service]
Environment="OLLAMA_HOST=0.0.0.0"
EOF
  systemctl daemon-reload >> "$NEXACORE_LOG_FILE" 2>&1
  systemctl restart ollama >> "$NEXACORE_LOG_FILE" 2>&1
  info "Ollama configured to listen on all interfaces"
}

main() {
  require_root; require_ubuntu
  print_banner "$TEMPLATE_NAME"
  setup_logging

  step "[1/6] Updating system..."; apt_update
  DEBIAN_FRONTEND=noninteractive apt-get upgrade -y -q >> "$NEXACORE_LOG_FILE" 2>&1
  step "[2/6] Creating directories..."; setup_directories "$SERVICE_NAME"
  step "[3/6] Installing Ollama..."; install_ollama
  step "[4/6] Configuring service..."; configure_ollama_service
  step "[5/6] Configuring security..."; setup_firewall; setup_fail2ban; setup_ssh

  if [[ -n "$PULL_MODEL" ]]; then
    step "[6/6] Pulling model: $PULL_MODEL..."
    ollama pull "$PULL_MODEL" || warn "Model pull failed — try: ollama pull $PULL_MODEL"
  else
    step "[6/6] Skipping model pull (set PULL_MODEL=llama3 to pull automatically)"
  fi

  echo -e "\n${G}${W}╔══════════════════════════════════════════════╗${X}"
  echo -e "${G}${W}║         ✔ Ollama Ready!                       ║${X}"
  echo -e "${G}${W}╚══════════════════════════════════════════════╝${X}"
  echo -e "  ${W}API     :${X} http://localhost:${DEFAULT_PORT}"
  echo -e "  ${W}Logs    :${X} journalctl -u ollama -f"
  echo -e ""
  echo -e "  ${W}Useful commands:${X}"
  echo -e "    ollama pull llama3         # Download Llama 3"
  echo -e "    ollama pull mistral        # Download Mistral 7B"
  echo -e "    ollama pull nomic-embed-text  # Embeddings"
  echo -e "    ollama list                # List local models"
  echo -e "    ollama run llama3          # Interactive chat"
  echo ""
  echo -e "  ${W}Pair with Open WebUI:${X}"
  echo -e "    DOMAIN=ai.yourdomain.com bash <(curl -s https://templates.nexacore.cl/v1/openwebui/install.sh)"
  echo ""
}

main "$@"
