name: CI

on:
  push:
    branches: [master, dev]
  pull_request:
    branches: [master]

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - uses: oven-sh/setup-bun@v2
        with:
          bun-version: latest

      - name: Install dependencies
        run: bun install
        env:
          BUN_INSTALL_ALLOW_SCRIPTS: "@ast-grep/napi"

      - name: Run tests
        run: bun test

  typecheck:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - uses: oven-sh/setup-bun@v2
        with:
          bun-version: latest

      - name: Install dependencies
        run: bun install
        env:
          BUN_INSTALL_ALLOW_SCRIPTS: "@ast-grep/napi"

      - name: Type check
        run: bun run typecheck

  build:
    runs-on: ubuntu-latest
    needs: [test, typecheck]
    permissions:
      contents: write
    steps:
      - uses: actions/checkout@v4
        with:
          token: ${{ secrets.GITHUB_TOKEN }}

      - uses: oven-sh/setup-bun@v2
        with:
          bun-version: latest

      - name: Install dependencies
        run: bun install
        env:
          BUN_INSTALL_ALLOW_SCRIPTS: "@ast-grep/napi"

      - name: Build
        run: bun run build

      - name: Verify build output
        run: |
          test -f dist/index.js || (echo "ERROR: dist/index.js not found!" && exit 1)
          test -f dist/index.d.ts || (echo "ERROR: dist/index.d.ts not found!" && exit 1)

      - name: Auto-commit schema changes
        if: github.event_name == 'push' && github.ref == 'refs/heads/master'
        run: |
          if git diff --quiet assets/oh-my-opencode.schema.json; then
            echo "No schema changes to commit"
          else
            git config user.name "github-actions[bot]"
            git config user.email "github-actions[bot]@users.noreply.github.com"
            git add assets/oh-my-opencode.schema.json
            git commit -m "chore: auto-update schema.json"
            git push
          fi

  draft-release:
    runs-on: ubuntu-latest
    needs: [build]
    if: github.event_name == 'push' && github.ref == 'refs/heads/dev'
    permissions:
      contents: write
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - run: git fetch --force --tags

      - uses: oven-sh/setup-bun@v2
        with:
          bun-version: latest

      - name: Generate release notes
        id: notes
        run: |
          NOTES=$(bun run script/generate-changelog.ts)
          echo "notes<<EOF" >> $GITHUB_OUTPUT
          echo "$NOTES" >> $GITHUB_OUTPUT
          echo "EOF" >> $GITHUB_OUTPUT
        env:
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}

      - name: Create or update draft release
        run: |
          EXISTING_DRAFT=$(gh release list --json tagName,isDraft --jq '.[] | select(.isDraft == true and .tagName == "next") | .tagName')
          
          if [ -n "$EXISTING_DRAFT" ]; then
            echo "Updating existing draft release..."
            gh release edit next \
              --title "Upcoming Changes 🍿" \
              --notes "${{ steps.notes.outputs.notes }}" \
              --draft
          else
            echo "Creating new draft release..."
            gh release create next \
              --title "Upcoming Changes 🍿" \
              --notes "${{ steps.notes.outputs.notes }}" \
              --draft \
              --target ${{ github.sha }}
          fi
        env:
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
