on: [push]
jobs:
  check-changes:
    runs-on: docker
    outputs:
      all_changed_and_modified_files_count: ${{ steps.changed-files.outputs.all_changed_and_modified_files_count }}
    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Get changed files count
        id: changed-files
        uses: tj-actions/changed-files@v45
        with:
          files_ignore: 'doc/**,README.md,Dockerfile,.*'
          files_ignore_separator: ','
      - name: Print changed files count
        run: >
          echo "Changed files count: ${{ 
            steps.changed-files.outputs.all_changed_and_modified_files_count }}"

  build:
    needs: check-changes
    runs-on: docker
    container:
      image: ghcr.io/catthehacker/ubuntu:js-22.04
    if: ${{ needs.check-changes.outputs.all_changed_and_modified_files_count >= 1 }}
    permissions:
      contents: write

    steps:
      - uses: actions/checkout@v4
        with:
          submodules: recursive
      - uses: actions/setup-node@v4
        with:
          node-version: lts/*
          cache: yarn
          cache-dependency-path: '**/yarn.lock'
      - uses: actions/cache@v4
        with:
          path: |
            ~/.cache/pip
            ~/node_modules
          key: ${{ runner.os }}-pio
      - uses: actions/setup-python@v5
        with:
          python-version: '>=3.10'
      - name: Get current date
        id: dateAndTime
        run: echo "dateAndTime=$(date +'%Y-%m-%d-%H:%M')" >> $GITHUB_OUTPUT
      - name: Install mklittlefs
        run: >
          git clone https://github.com/earlephilhower/mklittlefs.git /tmp/mklittlefs &&
          cd /tmp/mklittlefs &&
          git submodule update --init &&
          make dist
      - name: Install yarn
        run: yarn && yarn postinstall
      - name: Run linter
        run: yarn lint
      - name: Run vitest tests
        run: yarn vitest run
      - name: Install Playwright Browsers
        run: npx playwright install --with-deps
      - name: Run Playwright tests
        run: npx playwright test
      - name: Build WebUI
        run: yarn build
      - name: Get current block
        id: getBlockHeight
        run: echo "blockHeight=$(curl -s https://mempool.space/api/blocks/tip/height)" >> $GITHUB_OUTPUT
      - name: Write block height to file
        env:
          BLOCK_HEIGHT: ${{ steps.getBlockHeight.outputs.blockHeight }}
        run: mkdir -p output && echo "$BLOCK_HEIGHT" > output/version.txt
      - name: gzip build for LittleFS
        run: find dist -type f ! -name ".*" -exec sh -c 'mkdir -p "build_gz/$(dirname "${1#dist/}")" && gzip -k "$1" -c > "build_gz/${1#dist/}".gz' _ {} \;
      - name: Write git rev to file
        run: echo "$GITHUB_SHA" > build_gz/fs_hash.txt && echo "$GITHUB_SHA" > output/commit.txt
      - name: Check GZipped directory size
        run: |
          # Set the threshold size in bytes
          THRESHOLD=410000

          # Calculate the total size of files in the directory
          DIRECTORY_SIZE=$(du -b -s build_gz | awk '{print $1}')

          # Fail the workflow if the size exceeds the threshold
          if [ "$DIRECTORY_SIZE" -gt "$THRESHOLD" ]; then
            echo "Directory size exceeds the threshold of $THRESHOLD bytes"
            exit 1
          else
            echo "Directory size is within the threshold $DIRECTORY_SIZE"
          fi
      - name: Create tarball
        run: tar czf webui.tgz --strip-components=1 dist
      - name: Build LittleFS
        run: |
          set -e
          /tmp/mklittlefs/mklittlefs -c build_gz -s 410000 output/littlefs.bin
      - name: Upload artifacts
        uses: https://code.forgejo.org/forgejo/upload-artifact@v4
        with:
          path: |
            webui.tgz
            output/littlefs.bin
      - name: Create release
        if: github.event_name == 'push' && github.ref == 'refs/heads/main'
        uses: https://code.forgejo.org/actions/forgejo-release@v2.4.0
        with:
          url: 'https://git.btclock.dev/'
          repo: '${{ github.repository }}'
          direction: upload
          tag: ${{ steps.getBlockHeight.outputs.blockHeight }}
          sha: '${{ github.sha }}'
          release-dir: output
          token: ${{ secrets.TOKEN }}
          override: false
          verbose: false
          release-notes-assistant: false