# ============================================================
# 遠端服務更新（Remote Service Update via Tailscale SSH）
# ============================================================
# 說明：透過 Tailscale SSH 連線到遠端主機，更新 Docker 服務
# 功能：停止服務 → 拉取最新映像 → 刪除舊映像 → 重新啟動
# ============================================================

name: Update Remote Service

on:
  # 手動觸發
  workflow_dispatch:
    inputs:
      prune_images:
        description: "是否清理 ConvertX-CN 舊映像？"
        required: false
        default: true
        type: boolean

# ============================================================
# 環境變數設定
# ============================================================
env:
  # 遠端主機專案目錄
  REMOTE_PROJECT_DIR: /home/bioailab/miniconda3/lid/app/convertx-cn
  # 容器名稱（用於顯示 log）
  CONTAINER_NAME: convertx-cn

jobs:
  update-service:
    name: 🔄 更新遠端服務
    runs-on: ubuntu-latest

    steps:
      # ========================================
      # Step 1: 啟動 Tailscale（非互動模式）
      # ========================================
      - name: 🔗 啟動 Tailscale 連線
        uses: tailscale/github-action@v2
        with:
          authkey: ${{ secrets.TAILSCALE_AUTHKEY }}
          args: "--ssh --accept-dns=false --accept-routes=false"

      # ========================================
      # Step 2: 驗證 Tailscale 連線
      # ========================================
      - name: ✅ 驗證 Tailscale 連線狀態
        run: |
          echo "========================================"
          echo "🔍 檢查 Tailscale 連線狀態"
          echo "========================================"

          echo ""
          echo "📊 Tailscale 狀態："
          tailscale status

          echo ""
          echo "🌐 本機 Tailscale IP："
          TAILSCALE_IP=$(tailscale ip -4)
          echo "${TAILSCALE_IP}"

          echo ""
          echo "🔐 檢查 SSH 功能狀態："
          if tailscale status --json | grep -q '"SSH":true'; then
            echo "✅ Tailscale SSH 功能已啟用"
          else
            echo "⚠️ 正在檢查 SSH 狀態..."
            tailscale status --json | head -50
          fi

          echo ""
          echo "⏳ 等待 Tailscale 連線穩定..."
          sleep 5

          echo ""
          echo "📡 測試與遠端主機的連通性..."
          echo "目標主機: ${{ secrets.SSH_HOST }}"

          if tailscale ping --c 3 "${{ secrets.SSH_HOST }}"; then
            echo ""
            echo "✅ Tailscale 連線測試成功！"
          else
            echo ""
            echo "⚠️ Tailscale ping 失敗，但 SSH 可能仍可運作，繼續執行..."
          fi

          echo "========================================"

      # ========================================
      # Step 3: Tailscale SSH 連線（手動網頁驗證）
      # 說明：首次連線需要點擊驗證 URL 完成授權
      # ========================================
      - name: 🔐 測試 Tailscale SSH 連線
        run: |
          echo "========================================"
          echo "🔐 測試 Tailscale SSH 連線"
          echo "========================================"
          echo "使用者: ${{ secrets.SSH_USER }}"
          echo "主機: ${{ secrets.SSH_HOST }}"
          echo ""
          echo "⚠️  如果出現驗證 URL，請在瀏覽器中開啟並完成驗證"
          echo "⏳ 驗證完成後，連線會自動繼續..."
          echo ""
          echo "========================================"

          timeout 600 tailscale ssh ${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }} \
            "echo '✅ Tailscale SSH 連線成功！' && echo '主機名稱:' && hostname && echo '當前使用者:' && whoami" \
            || { echo ""; echo "❌ SSH 連線失敗或超時，請確認已完成網頁驗證"; exit 1; }

          echo ""
          echo "========================================"

      # ========================================
      # Step 4: 顯示更新前服務狀態
      # ========================================
      - name: 📋 更新前服務狀態
        run: |
          echo "========================================"
          echo "📋 更新前服務狀態"
          echo "========================================"

          tailscale ssh ${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }} << 'REMOTE_EOF'
          set -e

          cd /home/bioailab/miniconda3/lid/app/convertx-cn

          echo "📦 目前運行的容器（docker compose ps）："
          docker compose ps

          echo ""
          echo "🏷️ 目前使用的映像版本："
          docker compose images

          echo ""
          echo "🐳 ConvertX-CN 容器狀態（docker ps）："
          docker ps --filter "name=convertx" --format "table {{.Names}}\t{{.Image}}\t{{.Status}}\t{{.Ports}}"

          echo ""
          echo "💾 磁碟空間使用情況："
          df -h / | head -2
          REMOTE_EOF

          echo "========================================"

      # ========================================
      # Step 5: 停止服務
      # ========================================
      - name: ⏹️ 停止服務
        run: |
          echo "========================================"
          echo "⏹️ 停止服務"
          echo "========================================"

          tailscale ssh ${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }} << 'REMOTE_EOF'
          set -e

          cd /home/bioailab/miniconda3/lid/app/convertx-cn

          echo "📋 停止 Docker Compose 服務..."
          docker compose down

          echo ""
          echo "✅ 服務已停止"
          REMOTE_EOF

          echo "========================================"

      # ========================================
      # Step 6: 拉取最新映像
      # ========================================
      - name: 📥 拉取最新映像
        run: |
          echo "========================================"
          echo "📥 拉取最新映像"
          echo "========================================"

          tailscale ssh ${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }} << 'REMOTE_EOF'
          set -e

          cd /home/bioailab/miniconda3/lid/app/convertx-cn

          echo "📋 拉取最新 Docker 映像..."
          docker compose pull

          echo ""
          echo "✅ 映像拉取完成"
          REMOTE_EOF

          echo "========================================"

      # ========================================
      # Step 7: 清理 ConvertX-CN 舊映像（可選）
      # ========================================
      - name: 🧹 清理 ConvertX-CN 舊映像
        if: ${{ github.event.inputs.prune_images == 'true' }}
        run: |
          echo "========================================"
          echo "🧹 清理 ConvertX-CN 舊映像"
          echo "========================================"

          tailscale ssh ${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }} << 'REMOTE_EOF'
          set -e

          echo "📋 清理前的 ConvertX-CN 映像："
          docker images | grep -E "convertx/convertx-cn|REPOSITORY" | head -10

          echo ""
          echo "🗑️ 移除 ConvertX-CN 舊版映像（保留 latest）..."
          docker images --format "{{.Repository}}:{{.Tag}} {{.ID}}" | \
            grep "convertx/convertx-cn" | \
            grep -v ":latest" | \
            awk '{print $2}' | \
            xargs -r docker rmi 2>/dev/null || true

          echo ""
          echo "📋 清理後的 ConvertX-CN 映像："
          docker images | grep -E "convertx/convertx-cn|REPOSITORY" | head -10

          echo ""
          echo "💾 磁碟空間："
          df -h / | head -2

          echo ""
          echo "✅ ConvertX-CN 舊映像清理完成"
          REMOTE_EOF

          echo "========================================"

      # ========================================
      # Step 8: 重新啟動服務
      # ========================================
      - name: ▶️ 重新啟動服務
        run: |
          echo "========================================"
          echo "▶️ 重新啟動服務"
          echo "========================================"

          tailscale ssh ${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }} << 'REMOTE_EOF'
          set -e

          cd /home/bioailab/miniconda3/lid/app/convertx-cn

          echo "📋 啟動 Docker Compose 服務..."
          docker compose up -d

          echo ""
          echo "⏳ 等待服務啟動..."
          sleep 10

          echo ""
          echo "📦 服務狀態（docker compose ps）："
          docker compose ps

          echo ""
          echo "🐳 ConvertX-CN 容器狀態（docker ps）："
          docker ps --filter "name=convertx" --format "table {{.Names}}\t{{.Image}}\t{{.Status}}\t{{.Ports}}"

          echo ""
          echo "✅ 服務已重新啟動"
          REMOTE_EOF

          echo "========================================"

      # ========================================
      # Step 9: 顯示服務 Log
      # ========================================
      - name: 📜 顯示服務 Log
        run: |
          echo "========================================"
          echo "📜 服務啟動 Log（全部）"
          echo "========================================"

          tailscale ssh ${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }} << 'REMOTE_EOF'
          set -e

          echo "📋 ConvertX-CN 容器 Log："
          docker logs convertx-cn 2>&1 || echo "⚠️ 無法取得 log，容器可能尚未完全啟動"
          REMOTE_EOF

          echo "========================================"

      # ========================================
      # Step 10: 健康檢查
      # ========================================
      - name: 🏥 健康檢查
        run: |
          echo "========================================"
          echo "🏥 服務健康檢查"
          echo "========================================"

          tailscale ssh ${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }} << 'REMOTE_EOF'
          set -e

          cd /home/bioailab/miniconda3/lid/app/convertx-cn

          echo "📋 容器運行狀態（docker compose ps）："
          docker compose ps

          echo ""
          echo "🏷️ 目前使用的映像版本："
          docker compose images

          echo ""
          echo "🐳 ConvertX-CN 容器狀態（docker ps）："
          docker ps --filter "name=convertx" --format "table {{.Names}}\t{{.Image}}\t{{.Status}}\t{{.Ports}}"

          # 檢查容器是否正常運行
          if docker ps --filter "name=convertx-cn" --format "{{.Names}}" | grep -q "convertx-cn"; then
            echo ""
            echo "✅ ConvertX-CN 服務運行正常！"
          else
            echo ""
            echo "❌ 警告：ConvertX-CN 容器未運行！"
            exit 1
          fi
          REMOTE_EOF

          echo "========================================"

      # ========================================
      # Step 11: 完成摘要
      # ========================================
      - name: 📋 更新完成摘要
        run: |
          echo "========================================"
          echo "✅ 遠端服務更新完成！"
          echo "========================================"
          echo ""
          echo "📦 更新資訊："
          echo "  - 專案目錄: /home/bioailab/miniconda3/lid/app/convertx-cn"
          echo "  - 遠端主機: ${{ secrets.SSH_HOST }}"
          echo "  - 清理舊映像: ${{ github.event.inputs.prune_images }}"
          echo ""
          echo "🔧 執行的操作："
          echo "  1. ⏹️ 停止服務"
          echo "  2. 📥 拉取最新映像"
          if [ "${{ github.event.inputs.prune_images }}" == "true" ]; then
            echo "  3. 🧹 清理 ConvertX-CN 舊映像"
          fi
          echo "  4. ▶️ 重新啟動服務"
          echo "  5. 📜 顯示服務 Log"
          echo "  6. 🏥 健康檢查"
          echo ""
          echo "========================================"
          echo "🎉 所有步驟已成功完成！"
          echo "========================================"
