#!/bin/bash
# Человеко-подобный ввод в окно Windows App через cliclick/osascript.
# Нужен Accessibility для Claude.app. Координаты — относительно окна RDP (по умолчанию).
# Для сервера это неотличимо от обычного ввода мыши/клавиатуры.
#
# Подкоманды:
#   activate                      — вывести окно Windows App на передний план
#   click X Y                     — клик по точке ОТНОСИТЕЛЬНО окна (0,0 = левый верх окна)
#   click-abs X Y                 — клик по абсолютным координатам экрана
#   dblclick X Y                  — двойной клик (относительно окна)
#   paste "текст"                 — положить текст в буфер и вставить в удалёнку (Ctrl+V)
#   copy                          — скопировать выделенное в удалёнке в буфер (Ctrl+C)
#   key <ctrl|alt|shift|cmd>+<кл> — послать сочетание (пример: key ctrl+v, key f5)
#   type "ascii"                  — набрать ASCII-текст напрямую (для кириллицы — paste)
set -euo pipefail
HERE="$(cd "$(dirname "$0")" && pwd)"
PROC="${RDP_PROC:-Windows App}"

win_origin() { "$HERE/rdp_win.sh" "$PROC" 2>/dev/null | awk '{print $1, $2}'; }

activate() { osascript -e "tell application \"$PROC\" to activate" 2>/dev/null || \
             osascript -e "tell application \"System Events\" to set frontmost of process \"$PROC\" to true"; }

abs_from_rel() { # X Y -> абсолютные экранные
  read -r OX OY < <(win_origin)
  echo "$((OX + $1)) $((OY + $2))"
}

cmd="${1:-}"; shift || true
case "$cmd" in
  activate) activate ;;
  click)      activate; read -r AX AY < <(abs_from_rel "$1" "$2"); cliclick "c:${AX},${AY}" ;;
  click-abs)  activate; cliclick "c:${1},${2}" ;;
  dblclick)   activate; read -r AX AY < <(abs_from_rel "$1" "$2"); cliclick "dc:${AX},${AY}" ;;
  type)       activate; cliclick "t:$1" ;;
  paste)      printf '%s' "$1" | pbcopy; activate; sleep 0.2; cliclick kd:ctrl t:v ku:ctrl ;;
  copy)       activate; sleep 0.1; cliclick kd:ctrl t:c ku:ctrl; sleep 0.2 ;;
  key)
    combo="$1"; mods="${combo%+*}"; keyname="${combo##*+}"
    IFS='+' read -ra MODS <<<"$mods"
    for m in "${MODS[@]}"; do cliclick "kd:$m"; done 2>/dev/null || true
    case "$keyname" in
      f[0-9]|f1[0-9]) cliclick "kp:$keyname" ;;
      esc|return|space|tab|delete|arrow-*|home|end|page-up|page-down) cliclick "kp:$keyname" ;;
      *) cliclick "t:$keyname" ;;
    esac
    for m in "${MODS[@]}"; do cliclick "ku:$m"; done 2>/dev/null || true
    ;;
  *) echo "usage: rdp_input.sh {activate|click|click-abs|dblclick|type|paste|copy|key} ..." >&2; exit 2 ;;
esac
