name: Update snaphots
run-name: Update snaphots for ${{ inputs.name }} v${{ inputs.version }}

on:
  workflow_call:
    inputs:
      name:
        required: true
        type: string
        description: Stack
        default: react
      version:
        required: true
        type: number
        description: Stack version
        default: 18
      node:
        type: number
        description: 'Node.js version (default: 16)'
      skip-tools:
        description: 'Skip tools build'
        type: boolean
      qa-path:
        type: string
      kit-path:
        type: string
      branch:
        description: 'Branch'
        type: string
        default: main
      qa:
        description: 'Rete QA (<name>@<version> or <owner>/<repo>#<version>)'
        type: string
        default: 'rete-qa@latest'
      kit:
        description: 'Rete Kit (<name>@<version> or <owner>/<repo>#<version>)'
        type: string
        default: 'rete-kit@latest'
  workflow_dispatch:
    inputs:
      name:
        required: true
        type: choice
        description: Stack
        options:
        - react
        - vue
        - angular
        - svelte
        - lit-vite
        default: react
      version:
        required: true
        type: number
        description: Stack version
        default: 18
      node:
        type: number
        description: 'Node.js version (default: 16)'
      branch:
        description: 'Branch'
        default: main
      qa:
        description: 'Rete QA (<name>@<version> or <owner>/<repo>#<version>)'
        type: string
        default: 'rete-qa@latest'
      kit:
        description: 'Rete Kit (<name>@<version> or <owner>/<repo>#<version>)'
        type: string
        default: 'rete-kit@latest'


jobs:
  tools:
    name: Prepare tools
    if: ${{ !inputs.skip-tools }}
    uses: ./.github/workflows/prepare-qa-kit.yml
    secrets: inherit
    with:
      qa: ${{ inputs.qa }}
      kit: ${{ inputs.kit }}

  update:
    timeout-minutes: 30
    runs-on: ubuntu-latest
    if: ${{ always() }}
    needs: tools
    # TODO reuse steps from regression.yml
    steps:
    - name: Download artifact with Rete QA
      uses: actions/download-artifact@v4
      if: ${{ needs.tools.outputs.qa-artifact || inputs.qa }}
      with:
        name: ${{ needs.tools.outputs.qa-artifact || inputs.qa }}
        path: .
    - name: Download artifact with Rete Kit
      uses: actions/download-artifact@v4
      if: ${{ needs.tools.outputs.kit-artifact || inputs.kit }}
      with:
        name: ${{ needs.tools.outputs.kit-artifact || inputs.kit }}
        path: .
    - name: Install fonts
      run: |
        sudo apt-get -qqy update
        sudo apt-get -qqy --no-install-recommends install \
          libfontconfig \
          libfreetype6 \
          xfonts-cyrillic \
          xfonts-scalable \
          fonts-liberation \
          fonts-ipafont-gothic \
          fonts-wqy-zenhei \
          fonts-tlwg-loma-otf \
          fonts-freefont-ttf
        sudo rm -rf /var/lib/apt/lists/*
        sudo apt-get -qyy clean
    - uses: actions/setup-node@v3
      with:
        node-version: ${{ inputs.node || 16 }}
    - name: Install Rete QA
      run: npm i -g ${{ inputs.qa-path || needs.tools.outputs.qa-path }} ${{ inputs.kit-path || needs.tools.outputs.kit-path }}
    - name: Install Playwright Browsers
      run: npx playwright install --with-deps
    - name: Init application
      run: rete-qa init -s ${{ inputs.name }} -sv ${{ inputs.version }}
      env:
        CI: ""
    - name: Update snapshots
      run: rete-qa test -s ${{ inputs.name }} -sv ${{ inputs.version }} -u
    - name: Get path to snapshots
      id: get_snapshots
      run: echo "path=$(npm root -g)/rete-qa/snapshots" >> $GITHUB_OUTPUT
    - uses: actions/upload-artifact@v4
      if: always()
      with:
        name: snapshots-${{ inputs.name }}-v${{ inputs.version }}
        path: ${{ steps.get_snapshots.outputs.path }}
        retention-days: 7

  send:
    runs-on: ubuntu-latest
    needs: update
    if: success('update')
    steps:
      # TODO reuse with update-docs.yml
      - name: Generate token
        id: generate_token
        uses: tibdex/github-app-token@v1
        with:
          app_id: ${{ secrets.APP_ID }}
          private_key: ${{ secrets.APP_PRIVATE_KEY }}

      - name: Checkout rete-qa repository
        uses: actions/checkout@v3
        with:
          fetch-depth: 0
          token: ${{ steps.generate_token.outputs.token }}
          repository: retejs/rete-qa
          ref: ${{ inputs.branch }}
      - name: Get path to snapshots
        id: snapshots_folder
        run: echo "path=./snapshots" >> $GITHUB_OUTPUT

      - name: Clear old snapshots
        run: rm -rf ${{ steps.snapshots_folder.outputs.path }}

      - uses: actions/download-artifact@v3
        with:
          name: snapshots-${{ inputs.name }}-v${{ inputs.version }}
          path: ${{ steps.snapshots_folder.outputs.path }}

      - name: Create Pull Request
        uses: peter-evans/create-pull-request@v5
        with:
          token: ${{ steps.generate_token.outputs.token }}
          base: ${{ inputs.branch }}
          author: rete-js[bot] <rete-js[bot]@users.noreply.github.com>
          commit-message: "fix(snaphots): update snapshots for ${{ inputs.name }} v${{ inputs.version }}"
          title: Update snapshots for ${{ inputs.name }} v${{ inputs.version }}
          branch: update-snapshots-${{ inputs.name }}-v${{ inputs.version }}-${{ inputs.branch }}
          body: "Snapshots update for ${{ inputs.name }} v${{ inputs.version }}"
          reviewers: Ni55aN


