name: Build
run-name: Running Lint Check and Licence checker on Pull Request
on: [pull_request]

jobs:
  Build-and-ng-test:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-node@v4
        with:
          node-version: 20.15.1

      - name: Install Google Chrome
        run: |
          wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -
          echo "deb http://dl.google.com/linux/chrome/deb/ stable main" > /etc/apt/sources.list.d/google.list
          apt-get update
          apt-get install -y google-chrome-stable xvfb

      - name: Write .npmrc file
        run: echo "$NPMRC" > client/.npmrc
        shell: bash
        env:
          NPMRC: ${{ secrets.NPMRC}}

      - name: Lint check
        run: npm run lint:check

      - name: Install dependencies
        run: |
          cd client
          # Decrypt and Install sheet
          echo ${{ secrets.SHEET_PWD }} | gpg --batch --yes --passphrase-fd 0 ./libraries/sheet-crypto.tgz.gpg
          npm ci

      - name: Licence checker
        run: |
          cd client
          npm run license-checker

      - name: Angular Tests
        run: |
          cd client
          npm run test:headless

      - name: Production Build
        run: |
          cd client
          npm run build

  Build-and-test-development:
    runs-on: ubuntu-latest
    needs: Build-production-and-ng-test

    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-node@v4
        with:
          node-version: 20.15.1

      - name: Write .npmrc file
        run: |
          touch client/.npmrc
          echo '${{ secrets.NPMRC}}' > client/.npmrc

      - run: apt-get update
      - run: wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
      - run: apt install -y ./google-chrome*.deb;
      - run: export CHROME_BIN=/usr/bin/google-chrome
      - run: apt-get update -y
      - run: apt-get -y install libgtk2.0-0 libgtk-3-0 libgbm-dev libnotify-dev libgconf-2-4 libnss3 libxss1 libasound2 libxtst6 xauth xvfb
      - run: apt -y install jq

      - name: Write cypress credentials
        run: echo "$CYPRESS_CREDS" > ./client/cypress.env.json
        shell: bash
        env:
          CYPRESS_CREDS: ${{ secrets.CYPRESS_CREDS }}

      - name: Install dependencies
        run: |
          cd client
          # Decrypt and Install sheet
          echo ${{ secrets.SHEET_PWD }} | gpg --batch --yes --passphrase-fd 0 ./libraries/sheet-crypto.tgz.gpg
          npm ci

      # Install pm2 and prepare SASJS server
      - run: npm i -g pm2
      - run: curl -L https://github.com/sasjs/server/releases/latest/download/linux.zip > linux.zip
      - run: unzip linux.zip
      - run: touch .env
      - run: echo RUN_TIMES=js >> .env
      - run: echo NODE_PATH=node >> .env
      - run: echo CORS=enable >> .env
      - run: echo WHITELIST=http://localhost:4200 >> .env
      - run: cat .env
      - run: pm2 start api-linux --wait-ready

      - name: Deploy mocked services
        run: |
          cd ./sas/mocks/sasjs
          npm install -g @sasjs/cli
          npm install -g replace-in-files-cli
          sasjs cbd -t server-ci
          # sasjs request services/admin/makedata -t server-ci -d ./deploy/makeData4GL.json -c ./deploy/requestConfig.json -o ./output.json

      - name: Install ZIP
        run: |
          apt-get update
          apt-get install zip

      - name: Prepare and run frontend and cypress
        run: |
          cd ./client
          mv ./cypress.env.example.json ./cypress.env.json
          replace-in-files --regex='"username".*' --replacement='"username":"'${{ secrets.CYPRESS_USERNAME_SASJS }}'",' ./cypress.env.json
          replace-in-files --regex='"password".*' --replacement='"password":"'${{ secrets.CYPRESS_PWD_SASJS }}'" ' ./cypress.env.json
          cat ./cypress.env.json
          npm run postinstall
          # Prepare index.html to SASJS local
          replace-in-files --regex='serverUrl=".*?"' --replacement='serverUrl="http://localhost:5000"' ./src/index.html
          replace-in-files --regex='appLoc=".*?"' --replacement='appLoc="/Public/app/devtest"' ./src/index.html
          replace-in-files --regex='serverType=".*?"' --replacement='serverType="SASJS"' ./src/index.html
          replace-in-files --regex='"hosturl".*' --replacement='hosturl:"http://localhost:4200",' ./cypress.config.ts
          cat ./cypress.config.ts
          # Start frontend and run cypress
          npx ng serve --host 0.0.0.0 --port 4200 & npx wait-on http://localhost:4200 && npx cypress run --browser chrome --spec "cypress/e2e/liveness.cy.ts,cypress/e2e/editor.cy.ts,cypress/e2e/excel-multi-load.cy.ts,cypress/e2e/excel.cy.ts,cypress/e2e/csv.cy.ts,cypress/e2e/filtering.cy.ts,cypress/e2e/licensing.cy.ts"

      - name: Zip Cypress videos
        if: always()
        run: |
          zip -r cypress-videos ./client/cypress/videos

      - name: Add cypress videos artifacts
        if: always()
        uses: actions/upload-artifact@v3
        with:
          name: cypress-videos.zip
          path: cypress-videos.zip
