name: Update, Build, Release and Deploy

on:
  schedule:
    - cron: "0 0 * * *"
  workflow_dispatch:

permissions:
  contents: write
  pages: write
  id-token: write

concurrency:
  group: main-automation
  cancel-in-progress: false

jobs:
  update:
    runs-on: ubuntu-latest
    outputs:
      items_changed: ${{ steps.dependency_update.outputs.items_changed }}

    steps:
      - name: Checkout Repository
        uses: actions/checkout@v7
        with:
          fetch-depth: 0

      - name: Setup Bun
        uses: oven-sh/setup-bun@v2
        with:
          bun-version: 1.3.12

      - name: Install Dependencies
        run: bun install --frozen-lockfile

      - name: Update Dependencies
        id: dependency_update
        shell: bash
        run: |
          before_items="$(bun pm ls @wfcd/items --all 2>/dev/null | grep '@wfcd/items@' || true)"
          bun update
          after_items="$(bun pm ls @wfcd/items --all 2>/dev/null | grep '@wfcd/items@' || true)"

          if [[ "$before_items" != "$after_items" ]]; then
            echo "items_changed=true" >> "$GITHUB_OUTPUT"
            echo "@wfcd/items changed: $before_items -> $after_items"
          else
            echo "items_changed=false" >> "$GITHUB_OUTPUT"
            echo "@wfcd/items did not change."
          fi

      - name: Build Project
        if: steps.dependency_update.outputs.items_changed == 'true'
        run: bun run build

      - name: Run Tests
        if: steps.dependency_update.outputs.items_changed == 'true'
        run: bun run test

      - name: Bump Package Version
        if: steps.dependency_update.outputs.items_changed == 'true'
        run: npm version patch --no-git-tag-version --force

      - name: Commit and Push Updates
        shell: bash
        run: |
          if git diff --quiet; then
            echo "No dependency updates found."
            exit 0
          fi

          git config user.name "GitHub Actions Bot"
          git config user.email "actions@github.com"
          git add -A
          git commit -m "chore: update dependencies"
          git pull --rebase origin main
          git push origin HEAD:main

  release:
    needs: update
    if: ${{ needs.update.outputs.items_changed == 'true' }}
    runs-on: ubuntu-latest

    steps:
      - name: Checkout Repository
        uses: actions/checkout@v7
        with:
          ref: main
          fetch-depth: 0

      - name: Create GitHub Release
        env:
          GH_TOKEN: ${{ github.token }}
        run: |
          version="v$(node -p "require('./package.json').version")"

          if git tag --list "$version" | grep -q .; then
            echo "Release $version already exists."
            exit 0
          fi

          gh release create "$version" \
            --title "$version" \
            --generate-notes \
            --target "$(git rev-parse HEAD)"

  deploy:
    needs: update
    if: ${{ needs.update.outputs.items_changed == 'true' }}
    runs-on: ubuntu-latest

    steps:
      - name: Checkout Repository
        uses: actions/checkout@v7
        with:
          ref: main

      - name: Setup Pages
        uses: actions/configure-pages@v6

      - name: Upload Pages Artifact
        uses: actions/upload-pages-artifact@v5
        with:
          path: .

      - name: Deploy Pages
        id: deployment
        uses: actions/deploy-pages@v5
