#!/bin/zsh

# Mac 螢幕永遠同步（鏡像）
# 雙擊執行後，只要第二螢幕仍連著，就會維持鏡像模式。
# 關閉此終端機視窗或按 Control+C 可停止監控。

export LC_ALL=C

TITLE="螢幕永遠同步"
CHECK_INTERVAL=5

clear
printf '\033[1;36m========================================\033[0m\n'
printf '\033[1;36m       Mac 螢幕永遠同步（鏡像）       \033[0m\n'
printf '\033[1;36m========================================\033[0m\n\n'

echo "功能：偵測到第二螢幕時，自動維持『鏡像顯示』。"
echo "拔掉外接螢幕後，Mac 會自然回到單螢幕。"
echo "要停止本程式：按 Control + C，或關閉這個視窗。"
echo ""

if [[ "$(uname)" != "Darwin" ]]; then
  echo "此程式只能在 macOS 執行。"
  read "?按 Enter 結束..."
  exit 1
fi

# 避免同時跑兩份
PIDFILE="$HOME/.mirror_guard.pid"
if [[ -f "$PIDFILE" ]]; then
  OLD_PID=$(cat "$PIDFILE" 2>/dev/null)
  if [[ -n "$OLD_PID" ]] && kill -0 "$OLD_PID" 2>/dev/null; then
    echo "鏡像監控已經在執行中（PID: $OLD_PID）。"
    echo "不用再開第二份。"
    read "?按 Enter 關閉這個視窗..."
    exit 0
  fi
fi

echo $$ > "$PIDFILE"
trap 'rm -f "$PIDFILE"; echo ""; echo "鏡像監控已停止。"; exit 0' INT TERM EXIT

get_display_info() {
  system_profiler SPDisplaysDataType 2>/dev/null
}

count_online_displays() {
  echo "$1" | grep -c "Online: Yes" | tr -d ' '
}

mirror_is_on() {
  echo "$1" | grep -q "Mirror: On"
}

open_accessibility_settings() {
  open "x-apple.systempreferences:com.apple.preference.security?Privacy_Accessibility" >/dev/null 2>&1 || true
}

toggle_mirror() {
  # 方法 1：Command + F1（Mac 常用鏡像快速鍵）
  local err
  err=$(osascript 2>&1 <<'APPLESCRIPT'
tell application "System Events"
    key code 122 using {command down}
end tell
APPLESCRIPT
)
  local rc=$?

  if [[ $rc -ne 0 ]]; then
    echo "⚠️ macOS 尚未允許此程式控制鍵盤。"
    echo "請到：系統設定 → 隱私權與安全性 → 輔助使用"
    echo "允許 Terminal（終端機）後，再回來執行一次。"
    open_accessibility_settings
    return 1
  fi

  sleep 2
  local info_after
  info_after=$(get_display_info)
  if mirror_is_on "$info_after"; then
    return 0
  fi

  # 方法 2：部分鍵盤設定下，用 Command + Brightness Down 的系統鍵碼
  osascript >/dev/null 2>&1 <<'APPLESCRIPT'
tell application "System Events"
    key code 107 using {command down}
end tell
APPLESCRIPT

  sleep 2
  info_after=$(get_display_info)
  mirror_is_on "$info_after"
}

LAST_STATE=""
FAIL_SHOWN=0

echo "✅ 監控已啟動。現在可以接上第二螢幕。"
echo ""

while true; do
  INFO=$(get_display_info)
  DISPLAY_COUNT=$(count_online_displays "$INFO")

  if [[ "$DISPLAY_COUNT" -ge 2 ]]; then
    if mirror_is_on "$INFO"; then
      STATE="mirrored"
      FAIL_SHOWN=0
      if [[ "$LAST_STATE" != "$STATE" ]]; then
        echo "✅ $(date '+%H:%M:%S') 已偵測到 $DISPLAY_COUNT 個螢幕，目前為鏡像同步。"
      fi
    else
      STATE="connected_not_mirrored"
      if [[ "$LAST_STATE" != "$STATE" ]]; then
        echo "🔄 $(date '+%H:%M:%S') 已偵測到第二螢幕，正在切換為鏡像同步…"
      fi

      if toggle_mirror; then
        echo "✅ $(date '+%H:%M:%S') 鏡像同步已開啟。"
        STATE="mirrored"
        FAIL_SHOWN=0
      else
        if [[ "$FAIL_SHOWN" -eq 0 ]]; then
          echo "⚠️ 自動切換失敗。完成『輔助使用』權限後，程式會再嘗試。"
          FAIL_SHOWN=1
        fi
      fi
    fi
  else
    STATE="single"
    FAIL_SHOWN=0
    if [[ "$LAST_STATE" != "$STATE" ]]; then
      echo "ℹ️  $(date '+%H:%M:%S') 目前只有 Mac 螢幕；等待第二螢幕連接。"
    fi
  fi

  LAST_STATE="$STATE"
  sleep "$CHECK_INTERVAL"
done
