# This is a basic workflow to help you get started with Actions

name: CI

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

# Controls when the action will run.
on:
  # Triggers the workflow on push or pull request events but only for the main branch
  push:
    branches: [main]
    tags:
      - v*
  pull_request:
    branches: [main]

  # Allows you to run this workflow manually from the Actions tab
  workflow_dispatch:

env:
  CacheFolders: |
    common
    deploy
    dev
    models
    packages
    plugins
    pods
    products
    server
    server-plugins
    templates
    tests
    rush.json
    .prettierrc
    tools

# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
  # This workflow contains a single job called "build"
  build:
    # The type of runner that the job will run on
    runs-on: ubuntu-latest

    # Steps represent a sequence of tasks that will be executed as part of the job
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0
      - name: Cache node modules
        uses: actions/cache@v3
        env:
          cache-name: cache-node-modules
        with:
          path: |
            common/temp
          key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/pnpm-lock.yaml') }}
          restore-keys: |
            ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/pnpm-lock.yaml') }}

      - name: Checking for mis-matching dependencies...
        run: node common/scripts/install-run-rush.js check

      - name: Installing...
        run: node common/scripts/install-run-rush.js install

      - name: Setting model version from git release...
        run: node common/scripts/install-run-rush.js bump-model-version

      - name: Building...
        run: node common/scripts/install-run-rush.js build

      - name: Bundle
        run: node common/scripts/install-run-rush.js bundle

      - name: Cache build results
        uses: actions/cache@v3
        env:
          cache-name: cache-build-results
        with:
          path: ${{ env.CacheFolders}}
          key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ github.sha }}
          restore-keys: ${{ runner.os }}-build-${{ env.cache-name }}-${{ github.sha }}
  svelte-check:
    needs: build
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Cache build results
        uses: actions/cache@v3
        env:
          cache-name: cache-build-results
        with:
          path: ${{ env.CacheFolders}}
          key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ github.sha }}
          restore-keys: ${{ runner.os }}-build-${{ env.cache-name }}-${{ github.sha }}

      - name: Checking svelte sources...
        run: node common/scripts/install-run-rush.js svelte-check
  formatting:
    needs: build
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0
      - name: Cache build results
        uses: actions/cache@v3
        env:
          cache-name: cache-build-results
        with:
          path: ${{ env.CacheFolders}}
          key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ github.sha }}
          restore-keys: ${{ runner.os }}-build-${{ env.cache-name }}-${{ github.sha }}

      - name: Formatting...
        run: node common/scripts/install-run-rush.js fast-format
      - name: Check files formatting
        run: |
          echo '================================================================'
          echo 'Checking for diff files'
          echo '================================================================'
          git diff '*.ts' '*.svelte' | cat
          [ -z "$(git diff --name-only '*.ts' '*.svelte' | cat)" ]
          echo '================================================================'
  test:
    needs: build
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Cache build results
        uses: actions/cache@v3
        env:
          cache-name: cache-build-results
        with:
          path: ${{ env.CacheFolders}}
          key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ github.sha }}
          restore-keys: ${{ runner.os }}-build-${{ env.cache-name }}-${{ github.sha }}
      - name: Start MongoDB
        uses: supercharge/mongodb-github-action@v1.10.0
        with:
          mongodb-version: 5.0

      - name: Testing...
        run: node common/scripts/install-run-rush.js test --verbose
  uitest:
    needs: build
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0
      - name: Cache build results
        uses: actions/cache@v3
        env:
          cache-name: cache-build-results
        with:
          path: ${{ env.CacheFolders}}
          key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ github.sha }}
          restore-keys: ${{ runner.os }}-build-${{ env.cache-name }}-${{ github.sha }}
        
      - name: Docker build
        run: node common/scripts/install-run-rush.js docker:build
        env:
          DOCKER_CLI_HINTS: false

      - name: Prepare server
        run: |
          cd ./tests
          ./prepare.sh
      - name: Install Playwright
        run: |
          cd ./tests/sanity
          node ../../common/scripts/install-run-rushx.js ci
      - name: Run UI tests
        run: |
          cd ./tests/sanity
          node ../../common/scripts/install-run-rushx.js uitest
      - name: "Store docker logs"
        if: always()
        run: |
          cd ./tests/sanity
          mkdir logs
          docker logs $(docker ps | grep transactor | cut -f 1 -d ' ') > logs/transactor.log
          docker logs $(docker ps | grep account | cut -f 1 -d ' ') > logs/account.log
          docker logs $(docker ps | grep front | cut -f 1 -d ' ') > logs/front.log
      - name: Upload test results
        if: always()
        uses: actions/upload-artifact@v3
        with:
          name: playwright-results
          path: ./tests/sanity/playwright-report/
      - name: Generates Allure Report
        uses: simple-elf/allure-report-action@master
        if: always()
        id: allure-report
        with:
          allure_results: ./tests/sanity/allure-results/
          gh_pages: gh-pages
          allure_report: allure-report
          allure_history: allure-history
      - name: Upload allure test results
        if: always()
        uses: actions/upload-artifact@v3
        with:
          name: allure-report
          path: ./allure-report/
      - name: Deploy report to Github Pages
        if: ${{ github.ref == 'refs/heads/main' }}
        uses: peaceiris/actions-gh-pages@v3
        with:
          PERSONAL_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          PUBLISH_BRANCH: gh-pages
          PUBLISH_DIR: allure-history
      - name: Upload Logs
        if: always()
        uses: actions/upload-artifact@v3
        with:
          name: docker-logs
          path: ./tests/sanity/logs
      # - name: Upload DB snapshot
      #   if: always()
      #   uses: actions/upload-artifact@v3
      #   with:
      #     name: db-snapshot
      #     path: ./tests/db_dump
  docker-build:
    if: ${{ github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/v') }}
    needs: [build, uitest, test, svelte-check]
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0
      - name: Cache build results
        uses: actions/cache@v3
        env:
          cache-name: cache-build-results
        with:
          path: ${{ env.CacheFolders}}
          key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ github.sha }}
          restore-keys: ${{ runner.os }}-build-${{ env.cache-name }}-${{ github.sha }}

      - name: Installing...
        run: node common/scripts/install-run-rush.js install
      - name: Setting model version from git release...
        run: node common/scripts/install-run-rush.js bump-model-version
      - name: Build, to include new model version
        run: node common/scripts/install-run-rush.js build
      - name: Bundle
        run: node common/scripts/install-run-rush.js bundle
      - name: Docker build
        run: node common/scripts/install-run-rush.js docker:build
        env:
          DOCKER_CLI_HINTS: false
      - name: Login to Docker Hub
        uses: docker/login-action@v3
        with:
          username: hardcoreeng
          password: ${{ secrets.DOCKER_ACCESS_TOKEN }}

      - name: Docker push staging
        if: ${{ github.ref == 'refs/heads/main' }}
        run: node common/scripts/install-run-rush.js docker:staging
      - name: Docker push tag
        if: ${{ startsWith(github.ref, 'refs/tags/v') }}
        run: |
          echo Pushing release of tag ${{ github.ref }}
          node common/scripts/install-run-rush.js docker:push