name: 🚀 Deploy

on:
  push:
    branches:
      - main
      - dev
  pull_request:

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

permissions:
  actions: write
  contents: read

jobs:
  lint:
    name: ⬣ ESLint
    runs-on: ubuntu-latest
    steps:
      - name: ⬇️ Checkout repo
        uses: actions/checkout@v3

      - name: ⎔ Setup node
        uses: actions/setup-node@v3
        with:
          cache: npm
          cache-dependency-path: ./package.json
          node-version: 18

      - name: 📥 Install deps
        run: npm install

      - name: 🔬 Lint
        run: npm run lint

  typecheck:
    name: ʦ TypeScript
    runs-on: ubuntu-latest
    steps:
      - name: ⬇️ Checkout repo
        uses: actions/checkout@v3

      - name: ⎔ Setup node
        uses: actions/setup-node@v3
        with:
          cache: npm
          cache-dependency-path: ./package.json
          node-version: 18

      - name: 📥 Install deps
        run: npm install

      - name: 🔎 Type check
        run: npm run typecheck --if-present

  vitest:
    name: ⚡ Vitest
    runs-on: ubuntu-latest
    steps:
      - name: ⬇️ Checkout repo
        uses: actions/checkout@v3

      - name: ⎔ Setup node
        uses: actions/setup-node@v3
        with:
          cache: npm
          cache-dependency-path: ./package.json
          node-version: 18

      - name: 📥 Install deps
        run: npm install

      - name: ⚡ Run vitest
        run: npm run test -- --coverage

  cypress:
    name: ⚫️ Cypress
    runs-on: ubuntu-latest
    steps:
      - name: ⬇️ Checkout repo
        uses: actions/checkout@v3

      - name: 🏄 Copy test env vars
        run: cp .env.example .env

      - name: ⎔ Setup node
        uses: actions/setup-node@v3
        with:
          cache: npm
          cache-dependency-path: ./package.json
          node-version: 18

      - name: 📥 Install deps
        run: npm install

      - name: 🛠 Setup Database
        run: npx prisma migrate reset --force

      - name: ⚙️ Build
        run: npm run build

      - name: 🌳 Cypress run
        uses: cypress-io/github-action@v5
        with:
          start: npm run start:mocks
          wait-on: http://localhost:8811
        env:
          PORT: 8811

  deploy:
    name: 🚀 Deploy
    runs-on: ubuntu-latest
    needs: [lint, typecheck, vitest, cypress]
    # only build/deploy main branch on pushes
    if: ${{ (github.ref == 'refs/heads/main' || github.ref == 'refs/heads/dev') && github.event_name == 'push' }}

    steps:
      - name: ⬇️ Checkout repo
        uses: actions/checkout@v3

      - name: 👀 Read app name
        uses: SebRollen/toml-action@v1.0.2
        id: app_name
        with:
          file: fly.toml
          field: app

      - name: 🚀 Deploy Staging
        if: ${{ github.ref == 'refs/heads/dev' }}
        uses: superfly/flyctl-actions@1.3
        with:
          args: deploy --remote-only --build-arg COMMIT_SHA=${{ github.sha }} --app ${{ steps.app_name.outputs.value }}-staging
        env:
          FLY_API_TOKEN: ${{ secrets.FLY_API_TOKEN }}

      - name: 🚀 Deploy Production
        if: ${{ github.ref == 'refs/heads/main' }}
        uses: superfly/flyctl-actions@1.3
        with:
          args: deploy --remote-only --build-arg COMMIT_SHA=${{ github.sha }} --app ${{ steps.app_name.outputs.value }}
        env:
          FLY_API_TOKEN: ${{ secrets.FLY_API_TOKEN }}
