name: Update usercount shields in READMEs, then sync to adamlui/ai-apps

on:
  schedule:
    - cron: "42 5 * * 0" # every Sun @ 5:52a

jobs:
  update-root-usercount-shields:
    runs-on: ubuntu-latest
    env:
      TZ: PST8PDT

    steps:
      - name: Checkout adamlui/chatgpt-auto-continue
        uses: actions/checkout@v4
        with:
          token: ${{ secrets.REPO_SYNC_PAT }}
          repository: adamlui/chatgpt-auto-continue
          path: adamlui/chatgpt-auto-continue

      - name: Checkout adamlui/ai-apps
        uses: actions/checkout@v4
        with:
          token: ${{ secrets.REPO_SYNC_PAT }}
          repository: adamlui/ai-apps
          path: adamlui/ai-apps

      - name: Fetch/sum user counts
        run: |
          expand_num() { # expand nums abbreviated w/ 'k' or 'm' suffix to integers
            local num=$(echo "$1" | tr '[:upper:]' '[:lower:]') # convert to lowercase
            if [[ $num =~ k$ ]] ; then
              num="${num%k}" # remove 'k' suffix
              num=$(awk "BEGIN { printf \"%.0f\", $num * 1000 }") # multiply by 1000
            elif [[ $num =~ m$ ]] ; then
              num="${num%m}" # remove 'm' suffix
              num=$(awk "BEGIN { printf \"%.0f\", $num * 1000000 }") # multiply by 1000000
            fi ; echo "$num"
          }

          format_total() {
            local num=$1 ; first_digit="${num:0:1}" second_digit="${num:1:1}"
            second_digit_rounded=$(( second_digit < 5 ? 0 : 5 ))
            if (( num >= 1000000000 )) ; then # 1B+ w/ one decimal place
              formatted_num="$(( num / 1000000000 ))"
              remainder=$(( (num % 1000000000) / 100000000 ))
              if (( remainder != 0 )) ; then formatted_num+=".$remainder" ; fi
              formatted_num+="B+"
            elif (( num >= 10000000 )) ; then # abbr 10,000,000+ to 999,000,000+
              formatted_num=$(printf "%'.f+" $((( num / 1000000 ) * 1000000 )))
            elif (( num >= 1000000 )) ; then # abbr 1,000,000+ to 9,500,000+
              formatted_num="${first_digit},${second_digit}00,000+"
            elif (( num >= 100000 )) ; then # abbr 100,000+ to 950,000+
              formatted_num="${first_digit}${second_digit_rounded}0,000+"
            elif (( num >= 10000 )) ; then # abbr 10,000+ to 90,000+
              formatted_num="${first_digit}0,000+"
            elif (( num >= 1000 )) ; then # abbr 1K to 9.9K
              formatted_num="$(( num / 1000 ))"
              remainder=$(( (num % 1000) / 100 ))
              if (( remainder != 0 )) ; then formatted_num+=".$remainder" ; fi
              formatted_num+="K"
            else formatted_num="$num" ; fi # preserve <1K as is
            echo "$formatted_num"
          }

          # Fetch Firefox daily user count
          base_url="https://addons.mozilla.org/api/v5/addons/addon/"
          app_id="chatgpt-auto-continue"
          ff_users=$(curl -s "$base_url$app_id/" |
            sed -n 's/.*"average_daily_users":\([0-9]*\).*/\1/p')
          echo "Firefox users: $ff_users"

          # Fetch Greasy Fork total user count
          base_url="https://img.shields.io/greasyfork/dt/"
          script_id="466789"
          gf_users=$(curl -s "$base_url$script_id" |
            sed -n 's/.*<title>installs: \([0-9.k]\+\)*<\/title>.*/\1/Ip')
          gf_users=$(expand_num "$gf_users")
          echo "Greasy Fork users: $gf_users"

          # Sum user counts
          total_users=$((ff_users + gf_users))
          echo -e "\n-----\nTotal users: $total_users\n-----\n"

          # Format totals
          formatted_total_users=$(format_total "$total_users")
          echo "Formatted total users: $formatted_total_users"

          # Expose as outputs for update step next
          echo "TOTAL_USERS=$formatted_total_users" >> $GITHUB_ENV

      - name: Update README shields
        run: |
          cd ${{ github.workspace }}/adamlui/chatgpt-auto-continue
          TOTAL_USERS="${{ env.TOTAL_USERS }}"
          if [ "$TOTAL_USERS" == "0" ] ; then echo "Error getting total usercount"
          else # perform update
            for readme in $(find docs/ -name "README.md") ; do
              old_readme=$(<"$readme")
              sed -i "s/\(badge\/[^-]*-\)[0-9.,km+]\+-/\1$TOTAL_USERS-/gI" "$readme"
              new_readme=$(<"$readme")
              if [ "$old_readme" != "$new_readme" ] ; then users_updated=true ; fi
            done          
            if [ "$users_updated" = true ] ; then echo "Usercount shields updated to $TOTAL_USERS"
            else echo "Usercount shields already up-to-date" ; fi
          fi

          # Set Updated flag to check in subseuqent steps
          if [ "$users_updated" = true ] ; then echo "USERS_UPDATED=true" >> $GITHUB_ENV ; fi

      - name: Sync ** to adamlui/ai-apps/chatgpt-auto-continue/
        if: env.USERS_UPDATED == 'true'
        run: |
          rsync -avhr --delete --exclude={'.*','eslint*','package*.json'} \
            ${{ github.workspace }}/adamlui/chatgpt-auto-continue/ \
            ${{ github.workspace }}/adamlui/ai-apps/chatgpt-auto-continue/
      
      - name: Config committer
        if: env.USERS_UPDATED == 'true'
        run: |
          gpg --batch --import <(echo "${{ secrets.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  "${{ secrets.GPG_PRIVATE_ID }}"

      - name: Push changes to adamlui/chatgpt-auto-continue
        if: env.USERS_UPDATED == 'true'
        run: |
          cd ${{ github.workspace }}/adamlui/chatgpt-auto-continue
          git add .
          git commit -n -m "Updated usercount shield counters in root READMEs" || true
          git push

      - name: Push changes to adamlui/ai-apps
        if: env.USERS_UPDATED == 'true'
        run: |
          cd ${{ github.workspace }}/adamlui/ai-apps
          git add .
          git commit -n -m "Updated usercount shield counters in ChatGPT Auto-Continue root READMEs" || true
          git push
