name: Sync ** to adamlui/ai-web-extensions/bravegpt/, then greasemonkey/ to adamlui/userscripts/chatgpt/bravegpt/

on:
  push:
    branches: [main]
    paths: ["**", "!.*"]

jobs:
  build:
    if: (github.repository == 'KudoAI/bravegpt') && !contains(github.event.head_commit.message, '[auto-sync')
    runs-on: ubuntu-24.04
    permissions:
      contents: read
    env:
      TZ: PST8PDT

    steps:

      - name: Checkout KudoAI/bravegpt
        uses: actions/checkout@v6.0.2
        with:
          token: ${{ secrets.REPO_SYNC_PAT }}
          path: KudoAI/bravegpt
          fetch-depth: 2

      - name: Checkout adamlui/ai-web-extensions
        uses: actions/checkout@v6.0.2
        with:
          token: ${{ secrets.REPO_SYNC_PAT }}
          repository: adamlui/ai-web-extensions
          path: adamlui/ai-web-extensions

      - name: Checkout adamlui/userscripts
        uses: actions/checkout@v6.0.2
        with:
          token: ${{ secrets.REPO_SYNC_PAT }}
          repository: adamlui/userscripts
          path: adamlui/userscripts

      - name: Sync docs between root & greasemonkey/
        run: |
          shopt -s globstar
          cd ${{ github.workspace }}/KudoAI/bravegpt
          loc_prefixes=( "root" "gm" )

          # Sync LICENSE.md
          for prefix in "${loc_prefixes[@]}" ; do
            eval "${prefix}_license_content=\$(git show HEAD:\"./\$([[ \$prefix == \"gm\" ]] && echo \"greasemonkey/\" || echo \"\")LICENSE.md\")"
            eval "${prefix}_license_modified=\$(git log -1 --format=\"%ct\" -- \"\$([[ \$prefix == \"gm\" ]] && echo \"greasemonkey/\" || echo \"\")LICENSE.md\")"
          done
          if (( root_license_modified > gm_license_modified )) ; then
            if [[ "$root_license_content" != "$gm_license_content" ]] ; then
              cp -f "LICENSE.md" "greasemonkey/LICENSE.md" ; sync_src="root" ; fi
          elif (( gm_license_modified > root_license_modified )) ; then
            if [[ "$gm_license_content" != "$root_license_content" ]] ; then
              cp -f "greasemonkey/LICENSE.md" "LICENSE.md" ; sync_src="greasemonkey" ; fi ; fi

          # Sync other docs
          for file in docs/**/*.md ; do
            for prefix in "${loc_prefixes[@]}" ; do
              eval "${prefix}_doc_path=\"./\$([[ \$prefix == \"gm\" ]] && echo \"greasemonkey/\" || echo \"\")docs/${file#"docs/"}\""
              eval "${prefix}_doc_content=\$(git show HEAD:\"\$${prefix}_doc_path\")"
              eval "${prefix}_doc_modified=\$(git log -1 --format=\"%ct\" -- \"\$${prefix}_doc_path\")"
            done
            if (( root_doc_modified > gm_doc_modified )) ; then
              if [[ "$root_doc_content" != "$gm_doc_content" ]] ; then
                cp -f "$root_doc_path" "$gm_doc_path" ; sync_src="root" ; fi
            elif (( gm_doc_modified > root_doc_modified )) ; then
              if [[ "$gm_doc_content" != "$root_doc_content" ]] ; then
                cp -f "$gm_doc_path" "$root_doc_path" ; sync_src="greasemonkey" ; fi ; fi
          done

          # Expose sync src for commit msg in self-push step
          echo "SYNC_SRC=$sync_src" >> $GITHUB_ENV

      - name: Sync ** to adamlui/ai-web-extensions/bravegpt/
        run: |
          rsync -avhc --delete --exclude '.*' \
            ${{ github.workspace }}/KudoAI/bravegpt/ \
            ${{ github.workspace }}/adamlui/ai-web-extensions/bravegpt/

      - name: Sync greasemonkey/ to adamlui/userscripts/chatgpt/bravegpt/
        run: |
          rsync -avhc --delete \
            ${{ github.workspace }}/KudoAI/bravegpt/greasemonkey/ \
            ${{ github.workspace }}/adamlui/userscripts/chatgpt/bravegpt/

      - name: Escape backticks in commit msg
        env:
          COMMIT_MSG: ${{ github.event.head_commit.message }}
        run: |
          DELIM="EOF_$(uuidgen)"
          echo "ESCAPED_MSG<<$DELIM" >> "$GITHUB_ENV"
          echo "$COMMIT_MSG" | sed 's/`/\`/g' >> "$GITHUB_ENV"
          echo "$DELIM" >> "$GITHUB_ENV"

      - name: Config committer
        env:
          GPG_PRIVATE_KEY: ${{ secrets.GPG_PRIVATE_KEY }}
          GPG_PRIVATE_ID: ${{ secrets.GPG_PRIVATE_ID }}
        run: |
          gpg --batch --import <(echo "$GPG_PRIVATE_KEY")
          git config --global commit.gpgsign true
          git config --global user.name "kudo-sync-bot"
          git config --global user.email "auto-sync@kudoai.com"
          git config --global user.signingkey "$GPG_PRIVATE_ID"

      - name: Push changes to KudoAI/bravegpt
        if: env.SYNC_SRC
        run: |
          cd ${{ github.workspace }}/KudoAI/bravegpt
          git add . && git commit -n -m "$ESCAPED_MSG ↞ [auto-sync from $SYNC_SRC/]" || true
          git pull --rebase 
          git push

      - name: Push changes to adamlui/ai-web-extensions
        run: |
          cd ${{ github.workspace }}/adamlui/ai-web-extensions
          git add . && git commit -n -m "$ESCAPED_MSG ↞ [auto-sync from https://github.com/KudoAI/bravegpt]" || true
          git pull --rebase 
          git push

      - name: Push changes to adamlui/userscripts
        run: |
          cd ${{ github.workspace }}/adamlui/userscripts
          git add . && git commit -n -m "$ESCAPED_MSG ↞ [auto-sync from https://github.com/KudoAI/bravegpt]" || true
          git pull --rebase 
          git push
