name: Pull Request

on:
  pull_request:
    branches: [main]
    types: [opened, edited, synchronize]

jobs:
  lint-title:
    name: Validate PR title
    if: github.repository == 'KonradSzwarc/devscard'
    runs-on: ubuntu-latest
    steps:
      - uses: amannn/action-semantic-pull-request@v5
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          requireScope: false

  version:
    name: Check package.json version
    if: github.repository == 'KonradSzwarc/devscard'
    runs-on: ubuntu-latest
    steps:
      - name: Checkout PR branch
        uses: actions/checkout@v3
        with:
          ref: ${{ github.event.pull_request.head.sha }}
      - name: Get project information
        id: projectinfo-current
        uses: gregoranders/nodejs-project-info@v0.0.20
      - name: Checkout main branch
        uses: actions/checkout@v3
        with:
          ref: ${{ github.event.pull_request.base.sha }}
      - name: Get project information
        id: projectinfo-main
        uses: gregoranders/nodejs-project-info@v0.0.20
      - name: Get next possible versions
        id: semvers
        uses: WyriHaximus/github-action-next-semvers@v1
        with:
          version: ${{ steps.projectinfo-main.outputs.version }}
      - name: Assert correct version bump
        uses: nick-fields/assert-action@v1
        with:
          expected: ${{ steps.projectinfo-current.outputs.version }}
          actual: 'Possible version bumps: ${{ steps.semvers.outputs.patch }}, ${{ steps.semvers.outputs.minor }}, ${{ steps.semvers.outputs.major }}'
          comparison: contains

  changelog:
    name: Check changelog
    if: github.repository == 'KonradSzwarc/devscard'
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
        with:
          ref: ${{ github.event.pull_request.head.sha }}
          fetch-depth: 0
      - name: Get project information
        id: projectinfo
        uses: gregoranders/nodejs-project-info@v0.0.20
      - name: Enforce changelog update
        uses: dangoslen/changelog-enforcer@v3
        with:
          expectedLatestVersion: ${{ steps.projectinfo.outputs.version }}
      - name: Get changelog entries
        id: changelog_reader
        uses: mindsers/changelog-reader-action@v2
        with:
          version: ${{ steps.projectinfo.outputs.version }}
      - name: Assert correct changelog version
        uses: nick-fields/assert-action@v1
        with:
          expected: ${{ steps.projectinfo.outputs.version }}
          actual: ${{ steps.changelog_reader.outputs.version }}

  prettier:
    name: Run Prettier check
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-node@v3
        with:
          node-version: 18
          cache: npm
      - name: Install dependencies
        run: npm ci
      - name: Run Prettier
        run: npm run prettier:check

  typescript:
    name: Run TypeScript check
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-node@v3
        with:
          node-version: 18
          cache: npm
      - name: Install dependencies
        run: npm ci
      - name: Run TypeScript types check
        run: npm run ts:check

  astro:
    name: Run Astro check
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-node@v3
        with:
          node-version: 18
          cache: npm
      - name: Install dependencies
        run: npm ci
      - name: Run Astro check
        run: npm run astro:check

  percy:
    name: Run Percy check
    if: github.repository == 'KonradSzwarc/devscard'
    needs: [prettier, typescript, astro, lint-title, version, changelog]
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-node@v3
        with:
          node-version: 18
          cache: npm
      - name: Install dependencies
        run: npm ci
      - name: Run Astro build command
        run: npm run build
        env:
          PUBLIC_APP_ENV: snapshot
      - name: Percy check
        env:
          PERCY_TOKEN: ${{ secrets.PERCY_TOKEN }}
        run: npx percy snapshot dist/

  preview:
    name: Create deploy preview
    needs: [prettier, typescript, astro, lint-title, version, changelog]
    if: github.repository == 'KonradSzwarc/devscard'
    runs-on: ubuntu-latest
    outputs:
      deploy-url: ${{ steps.netlify.outputs.deploy-url }}
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-node@v3
        with:
          node-version: 18
          cache: npm
      - name: Install dependencies
        run: npm ci
      - name: Run Astro build command
        run: npm run build
      - name: Deploy to Netlify
        id: netlify
        uses: nwtgck/actions-netlify@v2
        with:
          publish-dir: dist
          production-branch: main
          github-token: ${{ secrets.GITHUB_TOKEN }}
          alias: deploy-preview-${{ github.event.number }}
        env:
          NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }}
          NETLIFY_SITE_ID: ${{ secrets.NETLIFY_SITE_ID }}
        timeout-minutes: 1

  lighthouse:
    name: Run Lighthouse check
    if: github.repository == 'KonradSzwarc/devscard'
    needs: preview
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Lighthouse check
        uses: foo-software/lighthouse-check-action@master
        with:
          urls: ${{ needs.preview.outputs.deploy-url }}
          gitAuthor: ${{ github.actor }}
          gitBranch: ${{ github.ref }}
          gitHubAccessToken: ${{ secrets.GITHUB_TOKEN }}
          device: all
          prCommentEnabled: true
          prCommentSaveOld: false
