name: Update Docker Images and Helm Chart
on:
  push:
    branches:
      - main
  schedule:
    - cron: "0 0 * * 0"  # 毎週日曜日 00:00 UTC
  workflow_dispatch:  # 手動実行も可能にする

jobs:
  update:
    runs-on: ubuntu-latest
    permissions:
      contents: write  # Git pushに必要な権限を明示的に付与
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4
        with:
          fetch-depth: 0  # 完全な履歴を取得
          token: ${{ secrets.GITEA_TOKEN || github.token }}  # トークンを明示的に指定

      - name: Set up Git
        run: |
          git config user.name "Gitea Actions"
          git config user.email "actions@git.cafepieters.com"

      - name: Fetch latest WordPress FPM Alpine version
        id: wordpress
        run: |
          # Docker Hubから最新のWordPress FPM Alpineバージョンを取得（PHPバージョンも最新）
          echo "Fetching WordPress FPM Alpine versions..."
          
          # fpm-alpineタグを取得（全PHPバージョン対象）
          LATEST_VERSION=$(curl -s "https://hub.docker.com/v2/repositories/library/wordpress/tags?page_size=100&name=fpm-alpine" | \
            jq -r '.results[].name' | \
            grep -E '^[0-9]+\.[0-9]+(\.[0-9]+)?-php[0-9]+\.[0-9]+-fpm-alpine$' | \
            grep -v 'rc' | \
            grep -v 'beta' | \
            grep -v 'alpha' | \
            sort -t- -k1,1V -k2,2V | \
            tail -n 1)
          
          if [ -z "$LATEST_VERSION" ]; then
            echo "Failed to fetch from first method, trying alternative..."
            # 代替方法: すべてのfpm-alpineタグを取得
            LATEST_VERSION=$(curl -s "https://hub.docker.com/v2/repositories/library/wordpress/tags?page_size=100" | \
              jq -r '.results[].name' | \
              grep -E '^[0-9]+\.[0-9]+\.[0-9]+-php[0-9]+\.[0-9]+-fpm-alpine$' | \
              grep -v 'rc' | \
              grep -v 'beta' | \
              grep -v 'alpha' | \
              sort -t- -k1,1V -k2,2V | \
              tail -n 1)
          fi
          
          if [ -z "$LATEST_VERSION" ]; then
            echo "ERROR: Failed to fetch WordPress version"
            exit 1
          fi
          
          echo "WordPress latest version: $LATEST_VERSION"
          
          # バージョン情報を分解して表示
          WP_VERSION=$(echo $LATEST_VERSION | cut -d'-' -f1)
          PHP_VERSION=$(echo $LATEST_VERSION | cut -d'-' -f2)
          echo "  WordPress: $WP_VERSION"
          echo "  PHP: $PHP_VERSION"
          echo "  Base: fpm-alpine"
          
          echo "version=$LATEST_VERSION" >> $GITHUB_OUTPUT

      - name: Fetch latest Nginx Alpine Perl version
        id: nginx
        run: |
          # Docker Hubから最新のNginx Alpine Perlバージョンを取得
          echo "Fetching Nginx Alpine Perl versions..."
          
          LATEST_VERSION=$(curl -s "https://hub.docker.com/v2/repositories/library/nginx/tags?page_size=100&name=alpine-perl" | \
            jq -r '.results[].name' | \
            grep -E '^[0-9]+\.[0-9]+\.[0-9]+-alpine-perl$' | \
            grep -v 'rc' | \
            grep -v 'beta' | \
            grep -v 'alpha' | \
            sort -V | \
            tail -n 1)
          
          if [ -z "$LATEST_VERSION" ]; then
            echo "Failed to fetch from first method, trying alternative..."
            # 代替方法: alpine-perlタグを別の方法で検索
            LATEST_VERSION=$(curl -s "https://hub.docker.com/v2/repositories/library/nginx/tags?page_size=100" | \
              jq -r '.results[].name' | \
              grep 'alpine-perl$' | \
              grep -E '^[0-9]+\.[0-9]+\.[0-9]+-alpine-perl$' | \
              grep -v 'rc' | \
              grep -v 'beta' | \
              grep -v 'alpha' | \
              sort -V | \
              tail -n 1)
          fi
          
          if [ -z "$LATEST_VERSION" ]; then
            echo "ERROR: Failed to fetch Nginx version"
            exit 1
          fi
          
          echo "Nginx latest version: $LATEST_VERSION"
          
          # バージョン情報を表示
          NGINX_VERSION=$(echo $LATEST_VERSION | cut -d'-' -f1)
          echo "  Nginx: $NGINX_VERSION"
          echo "  Base: alpine-perl"
          
          echo "version=$LATEST_VERSION" >> $GITHUB_OUTPUT

      - name: Get current versions from values.yaml
        id: current
        run: |
          # 現在のバージョンを取得
          CURRENT_WORDPRESS=$(grep -A 3 'wordpress:' values.yaml | grep 'tag:' | awk -F'"' '{print $2}')
          CURRENT_NGINX=$(grep -A 3 'nginx:' values.yaml | grep 'tag:' | awk -F'"' '{print $2}')
          
          echo "current_wordpress=$CURRENT_WORDPRESS" >> $GITHUB_OUTPUT
          echo "current_nginx=$CURRENT_NGINX" >> $GITHUB_OUTPUT
          echo "Current WordPress: $CURRENT_WORDPRESS"
          echo "Current Nginx: $CURRENT_NGINX"

      - name: Check if update is needed
        id: check
        run: |
          UPDATE_NEEDED=false
          CHANGES=""
          
          if [ "${{ steps.current.outputs.current_wordpress }}" != "${{ steps.wordpress.outputs.version }}" ]; then
            echo "WordPress update available: ${{ steps.current.outputs.current_wordpress }} -> ${{ steps.wordpress.outputs.version }}"
            UPDATE_NEEDED=true
            CHANGES="${CHANGES}- WordPress: ${{ steps.current.outputs.current_wordpress }} -> ${{ steps.wordpress.outputs.version }}\n"
          else
            echo "WordPress is up to date: ${{ steps.current.outputs.current_wordpress }}"
          fi
          
          if [ "${{ steps.current.outputs.current_nginx }}" != "${{ steps.nginx.outputs.version }}" ]; then
            echo "Nginx update available: ${{ steps.current.outputs.current_nginx }} -> ${{ steps.nginx.outputs.version }}"
            UPDATE_NEEDED=true
            CHANGES="${CHANGES}- Nginx: ${{ steps.current.outputs.current_nginx }} -> ${{ steps.nginx.outputs.version }}\n"
          else
            echo "Nginx is up to date: ${{ steps.current.outputs.current_nginx }}"
          fi
          
          echo "update_needed=$UPDATE_NEEDED" >> $GITHUB_OUTPUT
          echo -e "changes<<EOF" >> $GITHUB_OUTPUT
          echo -e "$CHANGES" >> $GITHUB_OUTPUT
          echo "EOF" >> $GITHUB_OUTPUT

      - name: Update values.yaml
        if: steps.check.outputs.update_needed == 'true'
        run: |
          # バックアップを作成
          cp values.yaml values.yaml.bak
          
          # WordPressのtagを更新
          # image.wordpress.tagの行を特定して置換
          awk -v new_tag="${{ steps.wordpress.outputs.version }}" '
          /^image:/ { in_image=1 }
          in_image && /^  wordpress:/ { in_wordpress=1; print; next }
          in_wordpress && /^    tag:/ { 
            print "    tag: \"" new_tag "\""
            in_wordpress=0
            next
          }
          in_wordpress && /^  [a-z]/ { in_wordpress=0 }
          in_image && /^[a-z]/ { in_image=0 }
          { print }
          ' values.yaml.bak > values.yaml.tmp
          mv values.yaml.tmp values.yaml
          
          # Nginxのtagを更新
          cp values.yaml values.yaml.tmp
          awk -v new_tag="${{ steps.nginx.outputs.version }}" '
          /^image:/ { in_image=1 }
          in_image && /^  nginx:/ { in_nginx=1; print; next }
          in_nginx && /^    tag:/ { 
            print "    tag: \"" new_tag "\""
            in_nginx=0
            next
          }
          in_nginx && /^  [a-z]/ { in_nginx=0 }
          in_image && /^[a-z]/ { in_image=0 }
          { print }
          ' values.yaml.tmp > values.yaml
          rm values.yaml.tmp
          
          # 変更内容を表示
          echo "=== Changes in values.yaml ==="
          diff values.yaml.bak values.yaml || true
          
          # 実際に変更されたか確認
          if diff -q values.yaml.bak values.yaml > /dev/null; then
            echo "INFO: No changes were made to values.yaml (versions already up to date)"
            cat values.yaml | grep -A 5 "image:"
          else
            echo "Changes detected in values.yaml"
          fi
          
          echo "=== Updated values.yaml (image section) ==="
          grep -A 10 "^image:" values.yaml

      - name: Increment chart version
        if: steps.check.outputs.update_needed == 'true'
        id: increment
        run: |
          # Chart.yamlのバージョンをインクリメント
          if [ -f Chart.yaml ]; then
            CURRENT_CHART_VERSION=$(grep '^version:' Chart.yaml | awk '{print $2}')
            # パッチバージョンをインクリメント（例: 1.0.0 -> 1.0.1）
            NEW_CHART_VERSION=$(echo $CURRENT_CHART_VERSION | awk -F. '{print $1"."$2"."$3+1}')
            sed -i "s/^version: .*/version: $NEW_CHART_VERSION/" Chart.yaml
            echo "Chart version updated: $CURRENT_CHART_VERSION -> $NEW_CHART_VERSION"
            echo "new_chart_version=$NEW_CHART_VERSION" >> $GITHUB_OUTPUT
          else
            echo "Chart.yaml not found, skipping version increment"
            echo "new_chart_version=unknown" >> $GITHUB_OUTPUT
          fi

      - name: Commit and push changes
        if: steps.check.outputs.update_needed == 'true'
        run: |
          git add values.yaml Chart.yaml
          git status
          
          if git diff --staged --quiet; then
            echo "No changes to commit"
            exit 0
          fi
          
          # コミットメッセージを作成
          cat << EOF > /tmp/commit_msg.txt
          chore: Update Docker images
          
          ${{ steps.check.outputs.changes }}
          Auto-updated by Gitea Actions
          EOF
          
          git commit -F /tmp/commit_msg.txt
          
          # プッシュをリトライ機構付きで実行
          MAX_RETRIES=3
          RETRY_COUNT=0
          until git push origin main || [ $RETRY_COUNT -eq $MAX_RETRIES ]; do
            RETRY_COUNT=$((RETRY_COUNT+1))
            echo "Push failed, retrying ($RETRY_COUNT/$MAX_RETRIES)..."
            sleep 5
            git pull --rebase origin main
          done
          
          if [ $RETRY_COUNT -eq $MAX_RETRIES ]; then
            echo "ERROR: Failed to push after $MAX_RETRIES attempts"
            exit 1
          fi
          
          echo "Successfully pushed changes to main branch"

      - name: Install Helm
        if: steps.check.outputs.update_needed == 'true'
        uses: azure/setup-helm@v3
        with:
          version: 'latest'

      - name: Create Helm package
        if: steps.check.outputs.update_needed == 'true'
        run: |
          # packagesディレクトリを作成
          mkdir -p ./packages/
          
          # Helmパッケージを作成
          helm package . -d ./packages/
          
          # リポジトリインデックスを更新
          helm repo index ./packages/ --url https://git.cafepieters.com/helmchart/wordpress/raw/branch/main/packages/
          
          # パッケージファイルをコミット
          git add ./packages/*.tgz ./packages/index.yaml
          git commit -m "chore: Add Helm package for version ${{ steps.increment.outputs.new_chart_version }}" || echo "No package changes to commit"
          git push origin main || echo "Failed to push packages (this may be expected)"

      - name: Create release tag
        if: steps.check.outputs.update_needed == 'true'
        run: |
          # リリースタグを作成
          TAG_NAME="v${{ steps.increment.outputs.new_chart_version }}"
          
          cat << EOF > /tmp/tag_msg.txt
          Release $TAG_NAME
          
          ${{ steps.check.outputs.changes }}
          Chart version: ${{ steps.increment.outputs.new_chart_version }}
          EOF
          
          git tag -a "$TAG_NAME" -F /tmp/tag_msg.txt
          git push origin "$TAG_NAME" || echo "Failed to push tag (tag may already exist)"

      - name: Summary
        if: always()
        run: |
          echo "=== Workflow Summary ==="
          echo "Update needed: ${{ steps.check.outputs.update_needed }}"
          echo ""
          echo "WordPress:"
          echo "  Current: ${{ steps.current.outputs.current_wordpress }}"
          echo "  Latest:  ${{ steps.wordpress.outputs.version }}"
          echo ""
          echo "Nginx:"
          echo "  Current: ${{ steps.current.outputs.current_nginx }}"
          echo "  Latest:  ${{ steps.nginx.outputs.version }}"
          
          if [ "${{ steps.check.outputs.update_needed }}" == "true" ]; then
            echo ""
            echo "Chart version: ${{ steps.increment.outputs.new_chart_version }}"
            echo "Tag: v${{ steps.increment.outputs.new_chart_version }}"
          fi