name: Build and Release

on:
  push:
    tags:
      - v*

env:
  REGISTRY_HOST: git.ivanch.me
  REGISTRY_USERNAME: ivanch
  IMAGE_NAME: ${{ env.REGISTRY_HOST }}/ivanch/vision-start
  IMAGE_TAG: latest

jobs:
  build:
    runs-on: ubuntu-latest
    outputs:
      zip-file: vision-start-${{ gitea.ref_name }}.zip
    steps:
      - name: Check out repository code
        uses: actions/checkout@v4
      - name: Setup required tools
        run: sudo apt-get install zip jq curl -y
      - name: Install JS dependencies
        run: npm install
      - name: Run build
        run: npm run build
      - name: Prepare release
        run: |
          bash scripts/prepare_release.sh
          mv dist vision-start/
          mv manifest.json vision-start/
      - name: Create zip archive
        run: zip -r vision-start-${{ gitea.ref_name }}.zip vision-start
      - name: Upload artifact
        uses: actions/upload-artifact@v3
        with:
          name: release-zip
          path: vision-start-${{ gitea.ref_name }}.zip

  virus-total-check:
    runs-on: ubuntu-latest
    needs: build
    outputs:
      analysis-url: ${{ steps.vt-check.outputs.analysis-url }}
      detection-ratio: ${{ steps.vt-check.outputs.detection-ratio }}
    steps:
      - name: Check out repository code
        uses: actions/checkout@v4
      - name: Setup required tools
        run: sudo apt-get install jq curl -y
      - name: Download artifact
        uses: actions/download-artifact@v3
        with:
          name: release-zip
      - name: Run VirusTotal check
        id: vt-check
        env:
          virustotal_apikey: ${{ secrets.VIRUSTOTAL_APIKEY }}
          VIRUS_TOTAL_FILE: vision-start-${{ gitea.ref_name }}.zip
        run: |
          # Run the VirusTotal check script and capture output
          bash scripts/check_virustotal.sh > vt_output.txt 2>&1

          # Extract analysis URL and detection ratio from output
          ANALYSIS_URL=$(grep "Analysis URL:" vt_output.txt | cut -d' ' -f3- || echo "Not available")
          DETECTION_RATIO=$(grep "Detection ratio:" vt_output.txt | cut -d' ' -f3- || echo "Not available")

          # Set outputs for next job
          echo "analysis-url=$ANALYSIS_URL" >> $GITEA_OUTPUT
          echo "detection-ratio=$DETECTION_RATIO" >> $GITEA_OUTPUT

          # Display the full output
          cat vt_output.txt

  release:
    runs-on: ubuntu-latest
    needs: [build, virus-total-check]
    steps:
      - name: Check out repository code
        uses: actions/checkout@v4
      - name: Download artifact
        uses: actions/download-artifact@v3
        with:
          name: release-zip
      - name: Release zip
        uses: akkuman/gitea-release-action@v1
        with:
          body: |
            This is the release for version ${{ gitea.ref_name }}.

            **Virus Total Analysis URL:** ${{ needs.virus-total-check.outputs.analysis-url }}
            **Virus Total Detection Ratio:** ${{ needs.virus-total-check.outputs.detection-ratio }}
          name: ${{ gitea.ref_name }}
          tag_name: ${{ gitea.ref_name }}
          files: vision-start-${{ gitea.ref_name }}.zip

  build_vision_start:
    name: Build Vision Start Image
    runs-on: ubuntu-latest
    needs: build
    steps:
      - name: Check out repository
        uses: actions/checkout@v2

      - name: Log in to Container Registry
        run: |
          echo "${{ secrets.REGISTRY_PASSWORD }}" \
            | docker login "${{ env.REGISTRY_HOST }}" \
                -u "${{ env.REGISTRY_USERNAME }}" \
                --password-stdin

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3

      - name: Build and Push Multi-Arch Image
        uses: docker/build-push-action@v6
        with:
          push: true
          context: .
          platforms: linux/amd64,linux/arm64
          tags: |
            ${{ env.IMAGE_NAME }}:${{ env.IMAGE_TAG }}

  deploy_vision_start:
    name: Deploy Vision Start (production)
    runs-on: ubuntu-latest
    needs: build_vision_start
    steps:
      - name: Recreate Container
        uses: appleboy/ssh-action@v0.1.7
        with:
          host: ${{ secrets.HOST }}
          username: ${{ secrets.USERNAME }}
          key: ${{ secrets.KEY }}
          port: ${{ secrets.PORT }}
          script: |
            cd ${{ secrets.PROD_DIR }}
            docker compose pull
            docker compose up -d --force-recreate
