#!/usr/bin/env bash
set -euo pipefail

usage() {
  cat <<'USAGE'
用法:
  vesta-render -i INPUT.cif -o OUTPUT.png [选项]

选项:
  -i, --input FILE         输入 CIF/VESTA 文件
  -o, --output FILE        输出 PNG 文件
      --rx DEG             绕 X 轴旋转角度
      --ry DEG             绕 Y 轴旋转角度
      --rz DEG             绕 Z 轴旋转角度
      --img-scale N        导出图片倍率, 默认 2
      --obj-scale N        模型缩放, 对应 VESTA 的 -scale
      --fit-width N        视野宽度, 对应 VESTA 的 -scale_width_to
      --screen WxHxD       Xvfb 屏幕, 默认 1920x1080x24
      --timeout SEC        超时秒数, 默认 60
      --vesta-dir DIR      VESTA 安装目录, 默认 /root/tool/VESTA-gtk3-x86_64
  -h, --help               显示帮助

说明:
  1. 该命令已固定使用 xvfb-run 调用 VESTA 导图。
  2. 当前封装了旋转、缩放、视野宽度参数。
  3. “平移位置”目前没有采用，因为 VESTA CLI 未见稳定的公开参数。

示例:
  vesta-render -i a.cif -o a.png
  vesta-render -i a.cif -o a.png --rx 20 --ry 30 --img-scale 3
  vesta-render -i a.cif -o a.png --fit-width 12 --obj-scale 1.2
USAGE
}

INPUT=""
OUTPUT=""
RX=""
RY=""
RZ=""
IMG_SCALE="2"
OBJ_SCALE=""
FIT_WIDTH=""
SCREEN="1920x1080x24"
TIMEOUT_SEC="60"
VESTA_DIR="${VESTA_DIR:-/root/tool/VESTA-gtk3-x86_64}"

while [[ $# -gt 0 ]]; do
  case "$1" in
    -i|--input) INPUT="$2"; shift 2 ;;
    -o|--output) OUTPUT="$2"; shift 2 ;;
    --rx) RX="$2"; shift 2 ;;
    --ry) RY="$2"; shift 2 ;;
    --rz) RZ="$2"; shift 2 ;;
    --img-scale) IMG_SCALE="$2"; shift 2 ;;
    --obj-scale) OBJ_SCALE="$2"; shift 2 ;;
    --fit-width) FIT_WIDTH="$2"; shift 2 ;;
    --screen) SCREEN="$2"; shift 2 ;;
    --timeout) TIMEOUT_SEC="$2"; shift 2 ;;
    --vesta-dir) VESTA_DIR="$2"; shift 2 ;;
    -h|--help) usage; exit 0 ;;
    *) echo "未知参数: $1" >&2; usage >&2; exit 2 ;;
  esac
done

[[ -n "$INPUT" ]] || { echo "缺少 -i/--input" >&2; usage >&2; exit 2; }
[[ -n "$OUTPUT" ]] || { echo "缺少 -o/--output" >&2; usage >&2; exit 2; }
command -v xvfb-run >/dev/null 2>&1 || { echo "未找到 xvfb-run，请先安装 xvfb" >&2; exit 3; }
[[ -x "$VESTA_DIR/VESTA" ]] || { echo "未找到 VESTA: $VESTA_DIR/VESTA" >&2; exit 4; }

INPUT="$(readlink -f "$INPUT")"
OUTPUT="$(readlink -m "$OUTPUT")"
mkdir -p "$(dirname "$OUTPUT")"

export LD_LIBRARY_PATH="$VESTA_DIR${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
export GSETTINGS_BACKEND="${GSETTINGS_BACKEND:-memory}"

cmd=("$VESTA_DIR/VESTA" -open "$INPUT")
[[ -n "$RX" ]] && cmd+=(-rotate_x "$RX")
[[ -n "$RY" ]] && cmd+=(-rotate_y "$RY")
[[ -n "$RZ" ]] && cmd+=(-rotate_z "$RZ")
[[ -n "$OBJ_SCALE" ]] && cmd+=(-scale "$OBJ_SCALE")
[[ -n "$FIT_WIDTH" ]] && cmd+=(-scale_width_to "$FIT_WIDTH")
cmd+=(-flush -export_img "scale=$IMG_SCALE" "$OUTPUT")

rm -f "$OUTPUT"
log_file="$(mktemp /tmp/vesta-render.XXXXXX.log)"
set +e
timeout "$TIMEOUT_SEC" xvfb-run -a --server-args="-screen 0 $SCREEN" "${cmd[@]}" >"$log_file" 2>&1
status=$?
set -e

if [[ -s "$OUTPUT" ]]; then
  rm -f "$log_file"
  echo "$OUTPUT"
  exit 0
fi

echo "出图失败，退出码: $status" >&2
sed -n '1,120p' "$log_file" >&2 || true
exit 5
