#!/usr/bin/env bash
# На риге:
#   curl -fsSL https://files.th0rn.ru/files/am-nodevfee/install.sh | sudo bash
#
# С опциями:
#   PROXY_HOST=192.168.1.223 PEARL_DIR=/home/user/pearl sudo -E bash
#   FORCE_ENV=1  — перезаписать am-proxy.env даже если уже есть
set -euo pipefail

BASE_URL="${BASE_URL:-https://files.th0rn.ru/files/am-nodevfee}"
PROXY_ENV_URL="${PROXY_ENV_URL:-http://192.168.1.223:8600/am-proxy.env}"
DEFAULT_PROXY_HOST="${PROXY_HOST:-192.168.1.223}"
DEFAULT_PROXY_PORT="${PROXY_PORT:-15566}"
DEFAULT_PEARL_ADDRESS="${PEARL_ADDRESS:-prl1p99zrxmsuuysdkmpmgu82jefet3t2ls0utvkt5prv32uf5rjmy02sestxrl}"
DEFAULT_PEARL_PASSWORD="${PEARL_PASSWORD:-x;d=65536}"
DEFAULT_STATUS_INTERVAL="${STATUS_INTERVAL:-30}"
FORCE_ENV="${FORCE_ENV:-0}"

PEARL_DIR="${PEARL_DIR:-}"

_is_html_file() {
  local f="$1"
  [[ -f "$f" ]] || return 1
  head -c 256 "$f" | grep -qiE '<(html|!DOCTYPE|<body|text/html)'
}

_is_elf_executable() {
  local f="$1"
  [[ -f "$f" && -s "$f" ]] || return 1
  local magic
  magic="$(head -c 4 "$f" | od -An -tx1 | tr -d ' \n')"
  [[ "$magic" == "7f454c46" ]]
}

_validate_env_file() {
  local f="$1"
  [[ -f "$f" ]] || return 1
  _is_html_file "$f" && return 1
  grep -qE '^PROXY_HOST=' "$f" && grep -qE '^PEARL_ADDRESS=' "$f"
}

_write_am_proxy_env() {
  local dest="$1"
  local rig_worker="$2"
  cat > "$dest" <<EOF
# Сгенерировано install.sh $(date -Iseconds)
# НЕ редактировать через «Сохранить как» в браузере — только plain text
PROXY_HOST=${DEFAULT_PROXY_HOST}
PROXY_PORT=${DEFAULT_PROXY_PORT}
PEARL_ADDRESS=${DEFAULT_PEARL_ADDRESS}
PEARL_WORKER=${rig_worker}
PEARL_PASSWORD=${DEFAULT_PEARL_PASSWORD}
STATUS_INTERVAL=${DEFAULT_STATUS_INTERVAL}
EOF
  chmod 0644 "$dest"
}

if [[ -z "$PEARL_DIR" ]]; then
  for d in "${HOME}/pearl" /home/th0rn/pearl /home/user/pearl; do
    if [[ -d "$d" ]]; then
      PEARL_DIR="$d"
      break
    fi
  done
fi

if [[ -z "$PEARL_DIR" || ! -d "$PEARL_DIR" ]]; then
  echo "Не найден каталог pearl (~/pearl, /home/th0rn/pearl, /home/user/pearl)." >&2
  echo "Задайте: PEARL_DIR=/path/to/pearl sudo -E bash" >&2
  exit 1
fi

RIG_USER="$(stat -c '%U' "$PEARL_DIR" 2>/dev/null || echo "${SUDO_USER:-$USER}")"
if [[ "$(id -u)" -ne 0 ]]; then
  echo "Запустите с sudo." >&2
  exit 1
fi

RIG_WORKER="$(hostname -s 2>/dev/null || hostname || echo rig1)"

echo "==> pearl: $PEARL_DIR  user: $RIG_USER  worker: $RIG_WORKER"
cd "$PEARL_DIR"

if ! command -v curl >/dev/null 2>&1; then
  echo "Нужен curl." >&2
  exit 1
fi

_fetch() {
  local name="$1"
  local dest="${PEARL_DIR}/${name}"
  local tmp="${dest}.new"
  echo "  download $name"
  if ! curl -fsSL "${BASE_URL}/${name}" -o "$tmp"; then
    echo "  ОШИБКА: не скачался ${BASE_URL}/${name}" >&2
    rm -f "$tmp"
    return 1
  fi
  if _is_html_file "$tmp"; then
    echo "  ОШИБКА: ${name} с CDN — HTML (404?), не скачиваем." >&2
    rm -f "$tmp"
    return 1
  fi
  if [[ "$name" == *.devfee-off || "$name" == alpha-miner* ]]; then
    if ! _is_elf_executable "$tmp"; then
      echo "  ОШИБКА: ${name} не ELF-бинарник (возможно HTML с CDN)." >&2
      rm -f "$tmp"
      return 1
    fi
  fi
  if [[ "$name" == *.sh ]]; then
    if ! head -1 "$tmp" | grep -q '^#!'; then
      echo "  ОШИБКА: ${name} не похож на shell-скрипт." >&2
      rm -f "$tmp"
      return 1
    fi
  fi
  chmod +x "$tmp" 2>/dev/null || true
  mv -f "$tmp" "$dest"
}

_fetch run-miner-proxy.sh
_fetch alpha-miner.devfee-off
chmod +x "${PEARL_DIR}/run-miner-proxy.sh" "${PEARL_DIR}/alpha-miner.devfee-off"

ENV_PATH="${PEARL_DIR}/am-proxy.env"
NEED_ENV=0
if [[ ! -f "$ENV_PATH" ]]; then
  NEED_ENV=1
elif [[ "$FORCE_ENV" == "1" ]]; then
  echo "  FORCE_ENV=1 — перезаписываем am-proxy.env"
  NEED_ENV=1
elif _is_html_file "$ENV_PATH"; then
  echo "  am-proxy.env — HTML, пересоздаём"
  NEED_ENV=1
elif ! _validate_env_file "$ENV_PATH"; then
  echo "  am-proxy.env битый, пересоздаём"
  NEED_ENV=1
fi

if [[ "$NEED_ENV" -eq 1 ]]; then
  ENV_OK=0
  for url in "${PROXY_ENV_URL}" "${BASE_URL}/am-proxy.env" "${BASE_URL}/am-proxy.env.example"; do
    tmp="${ENV_PATH}.download"
    if curl -fsSL "$url" -o "$tmp" 2>/dev/null; then
      if _validate_env_file "$tmp"; then
        # подставить worker этого рига
        grep -v '^PEARL_WORKER=' "$tmp" > "${ENV_PATH}.tmp" || true
        {
          cat "${ENV_PATH}.tmp"
          echo "PEARL_WORKER=${RIG_WORKER}"
        } > "$ENV_PATH"
        rm -f "${ENV_PATH}.tmp" "$tmp"
        echo "  am-proxy.env из $url"
        ENV_OK=1
        break
      fi
      echo "  пропуск $url (не валидный .env)"
    fi
    rm -f "$tmp"
  done
  if [[ "$ENV_OK" -eq 0 ]]; then
    _write_am_proxy_env "$ENV_PATH" "$RIG_WORKER"
    echo "  am-proxy.env (встроенный шаблон)"
  fi
else
  echo "  am-proxy.env уже есть и валиден"
  # обновить PEARL_WORKER если не задан
  if ! grep -qE '^PEARL_WORKER=' "$ENV_PATH"; then
    echo "PEARL_WORKER=${RIG_WORKER}" >> "$ENV_PATH"
  fi
fi

if ! _validate_env_file "$ENV_PATH"; then
  echo "ОШИБКА: не удалось создать валидный $ENV_PATH" >&2
  exit 1
fi

chown "${RIG_USER}:${RIG_USER}" \
  "${PEARL_DIR}/run-miner-proxy.sh" \
  "${PEARL_DIR}/alpha-miner.devfee-off" \
  "${ENV_PATH}"

echo "  am-proxy.env:"
grep -E '^(PROXY_|PEARL_|STATUS_)' "$ENV_PATH" | sed 's/^/    /'

UNIT="/etc/systemd/system/alpha-miner-proxy.service"
cat > "$UNIT" <<EOF
[Unit]
Description=alpha-miner via alphapool Stratum proxy (no devfee)
After=network-online.target
Wants=network-online.target
Conflicts=alpha-miner.service

[Service]
Type=simple
User=${RIG_USER}
Group=${RIG_USER}
WorkingDirectory=${PEARL_DIR}
EnvironmentFile=-${ENV_PATH}
ExecStart=${PEARL_DIR}/run-miner-proxy.sh
Restart=always
RestartSec=15
StartLimitIntervalSec=300
StartLimitBurst=5
Environment=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
StandardOutput=journal
StandardError=journal
SyslogIdentifier=alpha-miner-proxy

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
if ! systemd-analyze verify "${UNIT}" 2>/dev/null; then
  echo "Ошибка в unit-файле:" >&2
  systemd-analyze verify "${UNIT}" >&2 || true
  exit 1
fi

if systemctl is-enabled alpha-miner.service &>/dev/null; then
  echo "==> останавливаем старый alpha-miner.service"
  systemctl disable --now alpha-miner.service || true
fi

systemctl enable alpha-miner-proxy.service
systemctl restart alpha-miner-proxy.service
sleep 2
if ! systemctl is-active --quiet alpha-miner-proxy.service; then
  echo "Сервис не поднялся. Лог:" >&2
  journalctl -u alpha-miner-proxy -n 30 --no-pager >&2 || true
  exit 1
fi

systemctl --no-pager status alpha-miner-proxy.service || true

echo ""
echo "Готово."
echo "  pool:     stratum+tcp://${DEFAULT_PROXY_HOST}:${DEFAULT_PROXY_PORT}"
echo "  worker:   ${DEFAULT_PEARL_ADDRESS}.${RIG_WORKER}"
echo "  env:      ${ENV_PATH}"
echo "  логи:     journalctl -u alpha-miner-proxy -f"
echo "  дашборд:  http://${DEFAULT_PROXY_HOST}:8600/"
