#!/usr/bin/env bash
# Shared helpers for deployment scripts.

set -euo pipefail

DEPLOY_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
PROJECT_ROOT="$(cd "${DEPLOY_DIR}/.." && pwd)"

log()  { printf '[deploy] %s\n' "$*"; }
warn() { printf '[deploy][warn] %s\n' "$*" >&2; }
die()  { printf '[deploy][error] %s\n' "$*" >&2; exit 1; }

load_config() {
  local config_file="${DEPLOY_CONFIG:-}"
  if [[ -z "${config_file}" ]]; then
    if [[ -f "${DEPLOY_DIR}/deploy.conf.listara" ]]; then
      config_file="${DEPLOY_DIR}/deploy.conf.listara"
    else
      config_file="${DEPLOY_DIR}/deploy.conf"
    fi
  fi
  if [[ "${config_file}" != /* ]]; then
    config_file="${PROJECT_ROOT}/${config_file}"
  fi
  if [[ ! -f "${config_file}" ]]; then
    die "Missing ${config_file}. Rulează: bash deploy/setup-listara-local.sh"
  fi
  # shellcheck disable=SC1090
  source "${config_file}"

  # Blochează deploy accidental către Windows (permite doar deploy.conf.windows explicit)
  if [[ "${DEPLOY_HOST}" == "207.231.110.240" ]] && [[ "$(basename "${config_file}")" != "deploy.conf.windows" ]]; then
    die "Config trimite către Windows (${DEPLOY_HOST}), nu Listara! Rulează: bash deploy/setup-listara-local.sh"
  fi

  : "${DEPLOY_HOST:?Set DEPLOY_HOST in deploy config}"
  : "${DEPLOY_USER:?Set DEPLOY_USER in deploy config}"
  : "${DEPLOY_PATH:?Set DEPLOY_PATH in deploy config}"

  DEPLOY_PLATFORM="${DEPLOY_PLATFORM:-windows}"
  if [[ "${DEPLOY_PATH}" == /cygdrive/* ]] || [[ -n "${DEPLOY_PATH_WIN:-}" && "${DEPLOY_PATH_WIN}" != "${DEPLOY_PATH}" ]]; then
    DEPLOY_PLATFORM="windows"
  fi
  if [[ "${DEPLOY_PLATFORM}" == "linux" ]]; then
    DEPLOY_PATH_WIN="${DEPLOY_PATH_WIN:-${DEPLOY_PATH}}"
    PHP_BINARY="${PHP_BINARY:-php}"
    MYSQL_BIN="${MYSQL_BIN:-mysql}"
    MYSQLDUMP_BIN="${MYSQLDUMP_BIN:-mysqldump}"
  fi

  DEPLOY_PORT="${DEPLOY_PORT:-22}"
  DEPLOY_PATH_WIN="${DEPLOY_PATH_WIN:-${DEPLOY_PATH}}"
  SSH_KEY_PATH="${SSH_KEY_PATH:-deploy/keys/deploy_ed25519}"
  SSH_KNOWN_HOSTS="${SSH_KNOWN_HOSTS:-deploy/keys/known_hosts}"
  SSH_CONFIG_FILE="${SSH_CONFIG_FILE:-}"
  RUN_BUILD="${RUN_BUILD:-true}"
  RSYNC_DELETE="${RSYNC_DELETE:-true}"
  RSYNC_COMPRESS="${RSYNC_COMPRESS:-true}"
  DRY_RUN="${DRY_RUN:-false}"
  BACKUP_ENABLED="${BACKUP_ENABLED:-true}"
  BACKUP_DIR="${BACKUP_DIR:-deploy-backups}"
  BACKUP_KEEP="${BACKUP_KEEP:-5}"
  PROTECTED_ENV_FILES="${PROTECTED_ENV_FILES:-.env .env.production .env.local}"
  REMOTE_POST_DEPLOY="${REMOTE_POST_DEPLOY:-}"
  PHP_BINARY_WIN="${PHP_BINARY_WIN:-C:/xampp/php/php.exe}"
  MYSQL_BIN_WIN="${MYSQL_BIN_WIN:-C:/xampp/mysql/bin}"
  RUN_REMOTE_MIGRATIONS="${RUN_REMOTE_MIGRATIONS:-true}"
  RUN_REMOTE_CACHE_CLEAR="${RUN_REMOTE_CACHE_CLEAR:-true}"
  REMOTE_DB_BACKUP_BEFORE_MIGRATE="${REMOTE_DB_BACKUP_BEFORE_MIGRATE:-true}"
  DB_SYNC_REFERENCE_DATA="${DB_SYNC_REFERENCE_DATA:-false}"
  DB_SYNC_TABLES="${DB_SYNC_TABLES:-}"
  REFERENCE_MEDIA_SYNC="${REFERENCE_MEDIA_SYNC:-false}"
  REFERENCE_MEDIA_DRY_RUN="${REFERENCE_MEDIA_DRY_RUN:-false}"
  LOCAL_PHP_BINARY="${LOCAL_PHP_BINARY:-php}"
  DB_PUSH_MODE="${DB_PUSH_MODE:-merge}"
  DB_PUSH_EXCLUDE_TABLES="${DB_PUSH_EXCLUDE_TABLES:-}"
  REMOTE_DB_HOST="${REMOTE_DB_HOST:-127.0.0.1}"
  REMOTE_DB_PORT="${REMOTE_DB_PORT:-3306}"
  REMOTE_DB_DATABASE="${REMOTE_DB_DATABASE:-aadfirst_laravel}"
  REMOTE_DB_USERNAME="${REMOTE_DB_USERNAME:-root}"
  REMOTE_DB_PASSWORD="${REMOTE_DB_PASSWORD:-}"
  LOCAL_MYSQLDUMP_BIN="${LOCAL_MYSQLDUMP_BIN:-/opt/lampp/bin/mysqldump}"

  if [[ "${SSH_KEY_PATH}" != /* ]]; then
    SSH_KEY_PATH="${PROJECT_ROOT}/${SSH_KEY_PATH}"
  fi
  if [[ "${SSH_KNOWN_HOSTS}" != /* ]]; then
    SSH_KNOWN_HOSTS="${PROJECT_ROOT}/${SSH_KNOWN_HOSTS}"
  fi
  if [[ -n "${SSH_CONFIG_FILE}" && "${SSH_CONFIG_FILE}" != /* ]]; then
    SSH_CONFIG_FILE="${PROJECT_ROOT}/${SSH_CONFIG_FILE}"
  fi

  # Listara: identitate în ~/.ssh/listara-updater (fără spații în cale)
  local listara_identity="${HOME}/.ssh/listara-updater/config"
  if [[ "${DEPLOY_PLATFORM}" == "linux" && "${DEPLOY_HOST}" == "192.166.82.76" && -f "${listara_identity}" ]]; then
    SSH_CONFIG_FILE="${listara_identity}"
    SSH_KEY_PATH="${HOME}/.ssh/listara-updater/deploy_ed25519"
    SSH_KNOWN_HOSTS="${HOME}/.ssh/listara-updater/known_hosts"
  fi

  mkdir -p "$(dirname "${SSH_KEY_PATH}")" "$(dirname "${SSH_KNOWN_HOSTS}")"
  chmod 700 "$(dirname "${SSH_KEY_PATH}")" 2>/dev/null || true
}

ssh_cmd() {
  if [[ -n "${SSH_CONFIG_FILE:-}" && -f "${SSH_CONFIG_FILE}" ]]; then
    ssh -F "${SSH_CONFIG_FILE}" \
      -o ConnectTimeout=30 \
      "${DEPLOY_USER}@${DEPLOY_HOST}" "$@"
    return
  fi

  local ssh_opts=(
    -i "${SSH_KEY_PATH}"
    -p "${DEPLOY_PORT}"
    -o BatchMode=yes
    -o PasswordAuthentication=no
    -o IdentitiesOnly=yes
    -o ConnectTimeout=30
    -o ServerAliveInterval=15
    -o ServerAliveCountMax=4
  )
  if [[ -f "${SSH_KNOWN_HOSTS}" ]]; then
    ssh_opts+=(-F /dev/null)
    ssh_opts+=(-o "UserKnownHostsFile=${SSH_KNOWN_HOSTS}")
    ssh_opts+=(-o "StrictHostKeyChecking=yes")
  fi
  ssh "${ssh_opts[@]}" "${DEPLOY_USER}@${DEPLOY_HOST}" "$@"
}

remote_target() {
  printf '%s@%s:%s/' "${DEPLOY_USER}" "${DEPLOY_HOST}" "${DEPLOY_PATH}"
}

write_version_manifest() {
  local manifest="${DEPLOY_DIR}/backups/last-deploy.txt"
  mkdir -p "${DEPLOY_DIR}/backups"
  {
    echo "deployed_at=$(date -u +%Y-%m-%dT%H:%M:%SZ)"
    echo "deployed_by=$(whoami)@$(hostname)"
    echo "git_commit=$(git -C "${PROJECT_ROOT}" rev-parse HEAD 2>/dev/null || echo 'unknown')"
    echo "git_branch=$(git -C "${PROJECT_ROOT}" rev-parse --abbrev-ref HEAD 2>/dev/null || echo 'unknown')"
    echo "target=${DEPLOY_USER}@${DEPLOY_HOST}:${DEPLOY_PATH}"
  } > "${manifest}"
  log "Version manifest: ${manifest}"
}

build_rsync_filter_args() {
  local -a filters=()
  local f
  for f in ${PROTECTED_ENV_FILES}; do
    filters+=(--filter="P ${f}")
    filters+=(--exclude="${f}")
  done
  printf '%s\n' "${filters[@]}"
}
