#!/usr/bin/env bash
# 从本机（Mac）将 sdk 同步到公司 NAS 并执行 docker compose 部署
#
# 【铁律 · 必守】workphone.mdc §零.十 / 机擎 §〇.十
#   连接顺序：① NAS 局域网 :8899 → ② 本机 Docker → ③ NAS 外网 open.quwanzhi.com:8899
#   部署路径：/volume1/docker/workphone-sdk · DSM 05-业务网站-工作手机
#   部署后：bash sdk/scripts/nas_primary_agent_setup.sh
#
# 使用前请安装 OpenSSH 服务端于 NAS，并开启 Docker/Container Manager。
#
# 用法：
#   export NAS_USER=fnvtk              # 可选，默认 fnvtk
#   export NAS_HOST=192.168.110.101    # 可选，默认公司 NAS 局域网
#   export NAS_DIR=/volume1/docker/workphone-sdk   # 可选
#   # fnvtk 用户无直接 docker 权限，但 sudo docker NOPASSWD（Synology 默认 sudoers）
#   # 若 sudo docker 也无权限，用 NAS_SUDO_PASSWORD 授权 docker.sock：
#   export NAS_SUDO_PASSWORD='你的DSM密码'
#   bash sdk/scripts/deploy_nas_rsync.sh
#
# 可选：同步「开发文档」到 NAS 知识库挂载目录（需先在 docker-compose.nas.yml 取消注释挂载）
#   export SYNC_DEV_DOCS=1
#   export NAS_DOCS_DIR=/volume1/docker/workphone-docs

set -euo pipefail

NAS_HOST="${NAS_HOST:-192.168.110.101}"
NAS_USER="${NAS_USER:-fnvtk}"
NAS_DIR="${NAS_DIR:-/volume1/docker/workphone-sdk}"
# fnvtk 无直接 docker 权限，compose 命令前需 sudo（Synology sudoers NOPASSWD for docker）
DOCKER_CMD="${DOCKER_CMD:-sudo docker}"
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
SDK_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
REPO_ROOT="$(cd "$SDK_ROOT/.." && pwd)"

if [[ -n "${NAS_SUDO_PASSWORD:-}" ]]; then
  echo ">>> 修正 docker.sock 权限（sudo，与 DSM 登录密码一致）…"
  if ! ssh -o StrictHostKeyChecking=no "${NAS_USER}@${NAS_HOST}" \
    "sudo -S sh -c 'chgrp administrators /var/run/docker.sock && chmod g+rw /var/run/docker.sock && ls -la /var/run/docker.sock'" \
    <<< "$NAS_SUDO_PASSWORD"; then
    echo "sudo 失败：请确认 NAS_SUDO_PASSWORD 为 ${NAS_USER} 的 DSM 登录密码。"
    exit 1
  fi
fi

echo ">>> rsync sdk/ -> ${NAS_USER}@${NAS_HOST}:${NAS_DIR}/"
ssh "${NAS_USER}@${NAS_HOST}" "mkdir -p '${NAS_DIR}'"
# 严格排除非镜像构建所需目录（.runtime 含 46w+ 缓存文件，android-app/typescript-sdk/php-sdk 不进镜像）
rsync -avz \
  --exclude '.git' \
  --exclude '.env' \
  --exclude '.env.*' \
  --exclude '*secret*' \
  --exclude '*credential*' \
  --exclude '__pycache__' \
  --exclude '*.pyc' \
  --exclude 'node_modules' \
  --exclude '.runtime' \
  --exclude '.pytest_cache' \
  --exclude '.gradle' \
  --exclude 'android-app' \
  --exclude 'typescript-sdk' \
  --exclude 'php-sdk' \
  --exclude 'tests' \
  --exclude 'data/operation_logs' \
  --exclude 'data/e2e_report.json' \
  --exclude 'logs/*.log' \
  "${SDK_ROOT}/" "${NAS_USER}@${NAS_HOST}:${NAS_DIR}/"

if [[ "${SYNC_DEV_DOCS:-0}" == "1" ]]; then
  NAS_DOCS_DIR="${NAS_DOCS_DIR:-/volume1/docker/workphone-docs}"
  echo ">>> rsync 开发文档/ -> ${NAS_USER}@${NAS_HOST}:${NAS_DOCS_DIR}/开发文档/"
  if [[ ! -d "${REPO_ROOT}/开发文档" ]]; then
    echo "未找到 ${REPO_ROOT}/开发文档，跳过。"
  else
    ssh "${NAS_USER}@${NAS_HOST}" "mkdir -p '${NAS_DOCS_DIR}'"
    rsync -avz "${REPO_ROOT}/开发文档/" "${NAS_USER}@${NAS_HOST}:${NAS_DOCS_DIR}/开发文档/"
  fi
fi

echo ">>> 远程构建并启动容器…"
# /usr/syno/bin 在 PATH 前部（Synology docker binary 位置）；sudo 前置（fnvtk 无直接 docker 权限）
ssh -o StrictHostKeyChecking=no "${NAS_USER}@${NAS_HOST}" \
  "export PATH=\"/usr/local/bin:/usr/syno/bin:\$PATH\" && cd '${NAS_DIR}' && ${DOCKER_CMD} compose -f docker-compose.nas.yml up -d --build"

echo ""
echo "部署命令已下发。内网访问地址（将 NAS_HOST 换成实际 IP）："
echo "  控制台: http://${NAS_HOST}:8899/hub"
echo "  SDK API: http://${NAS_HOST}:8899"
echo ""
echo "若页面打不开：检查 NAS 防火墙是否放行 8899；DSM「登录门户」勿占用同端口。"
