name: 台灣行政機關辦公日曆自動更新

# 觸發條件
on:
  push:
  # 每月1號 UTC 00:00 執行 (台灣時間上午8點)
  schedule:
    - cron: "0 0 1 * *"
  # 支援手動觸發
  workflow_dispatch:

# 設定最小權限原則 - 僅授予必要權限
permissions:
  contents: write    # 僅授予內容寫入權限，用於提交和推送檔案
  actions: read      # 僅授予 actions 讀取權限

jobs:
  update-calendar:
    name: 更新台灣辦公日曆資料
    runs-on: ubuntu-latest
    timeout-minutes: 30
    # Job 層級權限設定
    permissions:
      contents: write      # 需要寫入檔案內容
      actions: read        # 需要讀取 actions

    steps:
      # 1. 檢出程式碼
      - name: 檢出程式碼
        uses: actions/checkout@v4
        with:
          fetch-depth: 0

      # 2. 設定Python環境
      - name: 設定Python 3.13環境
        uses: actions/setup-python@v5
        with:
          python-version: "3.13"
          cache: "pip"

      # 3. 安裝相依套件
      - name: 安裝相依套件
        run: |
          python -m pip install --upgrade pip
          pip install -r requirements.txt

      # 4. 設定Git使用者資訊
      - name: 設定Git使用者資訊
        run: |
          git config --local user.email "action@github.com"
          git config --local user.name "GitHub Action"

      # 5. 執行爬蟲程式
      - name: 執行台灣辦公日曆爬蟲
        run: |
          echo "開始執行台灣行政機關辦公日曆爬蟲系統..."
          python main.py
        env:
          PYTHONUNBUFFERED: 1
          FORCE_UPDATE: 'false'

      # 6. 檢查是否有檔案變更
      - name: 檢查檔案變更
        id: check_changes
        run: |
          git add .
          if git diff --staged --quiet; then
            echo "has_changes=false" >> $GITHUB_OUTPUT
            echo "沒有檔案需要更新"
          else
            echo "has_changes=true" >> $GITHUB_OUTPUT
            echo "發現檔案變更，準備提交"
            git status --porcelain
          fi

      # 7. 提交變更
      - name: 提交變更到Git
        if: steps.check_changes.outputs.has_changes == 'true'
        run: |
          # 取得當前日期時間
          CURRENT_DATE=$(date +'%Y-%m-%d %H:%M:%S')
          TAIWAN_DATE=$(TZ='Asia/Taipei' date +'%Y-%m-%d %H:%M:%S')

          # 統計檔案數量
          CSV_COUNT=$(find origin -name "*.csv" 2>/dev/null | wc -l || echo "0")
          JSON_COUNT=$(find docs -name "*.json" 2>/dev/null | wc -l || echo "0")

          # 提交變更
          git commit -m "🗓️ 自動更新台灣行政機關辦公日曆資料

          📊 更新統計:
          - CSV檔案: ${CSV_COUNT} 個
          - JSON檔案: ${JSON_COUNT} 個

          ⏰ 更新時間:
          - UTC: ${CURRENT_DATE}
          - 台灣時間: ${TAIWAN_DATE}

          🤖 由 GitHub Actions 自動執行"

          echo "變更已提交到本地Git"

      # 8. 推送變更到遠端倉庫
      - name: 推送變更到GitHub
        if: steps.check_changes.outputs.has_changes == 'true'
        uses: ad-m/github-push-action@v0.8.0
        with:
          github_token: ${{ secrets.GITHUB_TOKEN }}
          branch: ${{ github.ref }}
          force: false

      # 9. 執行結果通知
      - name: 執行結果摘要
        if: always()
        run: |
          echo "=================================="
          echo "台灣辦公日曆自動更新執行完成"
          echo "=================================="

          if [ "${{ steps.check_changes.outputs.has_changes }}" == "true" ]; then
            echo "✅ 狀態: 成功更新並推送檔案"
            CSV_COUNT=$(find origin -name "*.csv" 2>/dev/null | wc -l || echo "0")
            JSON_COUNT=$(find docs -name "*.json" 2>/dev/null | wc -l || echo "0")
            echo "📊 檔案統計: ${CSV_COUNT} 個CSV, ${JSON_COUNT} 個JSON"
          else
            echo "ℹ️  狀態: 沒有檔案需要更新"
          fi

          echo "🕒 執行時間: $(date +'%Y-%m-%d %H:%M:%S') UTC"
          echo "🌏 台灣時間: $(TZ='Asia/Taipei' date +'%Y-%m-%d %H:%M:%S')"
          echo "=================================="

      # 10. 上傳執行紀錄（當發生錯誤時）
      - name: 上傳執行紀錄
        if: failure()
        uses: actions/upload-artifact@v4
        with:
          name: execution-logs
          path: |
            origin/
            docs/
          retention-days: 7
