name: "Build main"

on:
  push:
    branches:
     - main
    paths:
     - '.github/workflows/**'
     - 'automation_tools/**'
     - 'config/**'
     - 'config/es-de/**'
     - 'functions/**'
     - 'rd-submodules/**'
     - '*.sh'
     - 'net.retrodeck.retrodeck.yml'
     - 'net.retrodeck.retrodeck.appdata.xml'
  pull_request: 
    branches:
     - main

  workflow_dispatch:


jobs:

  Building_RetroDECK:
    runs-on: retrodeck
    steps:

      # Circumventing this bug: https://github.com/flatpak/flatpak-builder/issues/317
      - name: Remove stuck mounts
        run: sudo umount -f /home/ubuntu/actions-runner/_work/RetroDECK/RetroDECK/.flatpak-builder/rofiles/*
        continue-on-error: true

      - name: Clone RetroDECK repo
        uses: actions/checkout@v4
        with:
          submodules: 'true'

      - name: "Install dependencies"
        run: "automation_tools/install_dependencies.sh"

      # backing up manifest in case download fails and hashes must be recalculated
      - name: Manifest backup
        run: "cp ${GITHUB_WORKSPACE}/net.retrodeck.retrodeck.yml ${GITHUB_WORKSPACE}/net.retrodeck.retrodeck.yml.bak"

      - name: Run pre-build automation tasks
        run : "/bin/bash ${GITHUB_WORKSPACE}/automation_tools/pre_build_automation.sh"

      - name: Read manifest content
        id: read_manifest
        run: echo "::set-output name=file_content::$(cat net.retrodeck.retrodeck.yml)"

      # - name: "Updating release notes in appdata"
      #   run: "automation_tools/appdata_management.sh"
        
      - name: Check versions (main only)
        id: check_version_string
        run: "automation_tools/main_version_checker.sh"

      - name: "[DEBUG] Outputting manifest"
        run: cat net.retrodeck.retrodeck.yml

      - name: "Build flatpak: download only"
        id: "flatpak-download"
        run: "/bin/bash ${GITHUB_WORKSPACE}/automation_tools/flatpak_build_download_only.sh"
        continue-on-error: true

      # Sometimes flatpak download fails, in this case it tries a second time
      - name: "Build flatpak: download only (retry)"
        if: steps.flatpak-download.outcome == 'failure'
        run: |
          echo "Download failed, maybe some hash changed since the build start."
          echo "Recalculating hashes and retrying download..."
          rm -f "{GITHUB_WORKSPACE}/net.retrodeck.retrodeck.yml"
          cp "${GITHUB_WORKSPACE}/net.retrodeck.retrodeck.yml.bak" "${GITHUB_WORKSPACE}/net.retrodeck.retrodeck.yml"
          "${GITHUB_WORKSPACE}/automation_tools/pre_build_automation.sh"
          "${GITHUB_WORKSPACE}/automation_tools/flatpak_build_download_only.sh"

      - name: Build flatpak
        run: "/bin/bash ${GITHUB_WORKSPACE}/automation_tools/flatpak_build_only.sh"

      - name: Create Artifact for flathub
        run: | 
          tar -czf ${GITHUB_WORKSPACE}/RetroDECK-Artifact.tar.gz -C ${GITHUB_WORKSPACE}/retrodeck-flatpak-main .
          hash=($(sha256sum ${GITHUB_WORKSPACE}/RetroDECK-Artifact.tar.gz))
          echo $hash > ${GITHUB_WORKSPACE}/RetroDECK-Artifact.sha
          mv -f RetroDECK-Artifact.* ${{ secrets.ARTIFACT_REPO }}

      - name: Create Bundle
        run: "/bin/bash ${GITHUB_WORKSPACE}/automation_tools/flatpak_build_bundle.sh"

      - name: Getting version info
        id: version
        run: |
          appdata="https://raw.githubusercontent.com/RetroDECK/RetroDECK/main/net.retrodeck.retrodeck.appdata.xml"
          REL_VER=$(curl -s $appdata | xmlstarlet sel -t -v "//release/@version" | head -1)
          DES="$(curl -s $appdata | xmlstarlet sel -t -m "//release[1]" -v "description" -n | sed '1,2d;$d;s/^ */- /;/^- $/d')"
          echo "REL_VER=$REL_VER" >> $GITHUB_ENV
          echo -e "# Release Notes\n" >> "body.md"
          echo "$DES" >> "body.md"

      - name: Publish the flatpak in a new release
        uses: ncipollo/release-action@v1
        env:
          REL_VER: ${{ env.REL_VER }}
        with:
          tag: ${{ env.REL_VER }}
          name: "RetroDECK v${{ env.REL_VER }}"
          bodyFile: "body.md"
          artifacts: "RetroDECK.flatpak,RetroDECK.flatpak.sha,RetroDECK-Artifact.tar.gz"
          allowUpdates: true
          makeLatest: true
          token: ${{ secrets.TRIGGER_BUILD_TOKEN }}
          repo: RetroDECK
        continue-on-error: true

      - name: Rewrite Tag
        run: |
          git submodule deinit -f --all
          git fetch --tags
          if git rev-parse --verify "${{ env.REL_VER }}" >/dev/null 2>&1; then # if the tag exists
              git tag -d "${{ env.REL_VER }}"                                  # remove it from local repo
              git push --delete origin "${{ env.REL_VER }}"                    # and from remote
          fi
          git tag "${{ env.REL_VER }}"             # Create the tag locally               
          git push origin "${{ env.REL_VER }}"     # Push the new tag in the remote repo

      # In case it cannot publish the release at least it's providing the flatpak file for creating a manual release
      - name: Upload RetroDECK.flatpak
        uses: actions/upload-artifact@v4
        with:
          name: retrodeck-flatpak
          path: RetroDECK.flatpak
        continue-on-error: true

      - name: Publish release on Gitea
        run: |
          # Set variables for Gitea host, organization, repository, access token, and release details
          GITEA_HOST="repo.retrodeck.net"
          UPLOAD_HOST="upload.retrodeck.net"
          ORGANIZATION="RetroDECK"
          REPO="RetroDECK"
          GITEA_TOKEN="${{ secrets.GITEA_TRIGGER_BUILD_TOKEN }}"
          RELEASE_NAME="RetroDECK v${{ env.REL_VER }}"
          TAG="${{ env.REL_VER }}"

          payload=$(jq -cn \
            --arg tag_name "$TAG" \
            --arg name "$RELEASE_NAME" \
            --arg body "$(cat body.md)" \
            '{$tag_name, $name, $body}'
          )

          # Create a release using curl and capture the release ID
          release_response=$(curl -X POST \
            -H "Authorization: token ${GITEA_TOKEN}" \
            -H "Content-Type: application/json" \
            -d "$payload" \
            "http://$GITEA_HOST/api/v1/repos/$ORGANIZATION/$REPO/releases"
          )

          # Extract the release ID from the response
          release_id=$(echo $release_response | jq -r '.id')

          # Upload artifacts
          curl -X POST \
              -H "Authorization: token ${GITEA_TOKEN}" \
              -H "X-GitHub-Token: ${{ secrets.UPLOAD_TOKEN }}" \
              -H "Content-Type: multipart/form-data" \
              -F "attachment=@RetroDECK.flatpak" \
              "http://$UPLOAD_HOST/api/v1/repos/$ORGANIZATION/$REPO/releases/$release_id/assets?name=RetroDECK-cooker.flatpak"

          curl -X POST \
              -H "Authorization: token ${GITEA_TOKEN}" \
              -H "X-GitHub-Token: ${{ secrets.UPLOAD_TOKEN }}" \
              -H "Content-Type: multipart/form-data" \
              -F "attachment=@RetroDECK-Artifact.tar.gz" \
              "http://$UPLOAD_HOST/api/v1/repos/$ORGANIZATION/$REPO/releases/$release_id/assets?name=RetroDECK-Artifact.tar.gz"
        continue-on-error: true # this will be in place until we reate an artifacts website that bypasses cloudflare limit

      - name: Upload RetroDECK.flatpak.sha to Gitea Release
        run: |
          curl -X POST \
            -H "Authorization: token ${GITEA_TOKEN}" \
            -H "X-GitHub-Token: ${{ secrets.UPLOAD_TOKEN }}" \
            -F "file=@RetroDECK.flatpak.sha" \
            "https://$UPLOAD_HOST/RetroDECK/RetroDECK/releases/${{ env.REL_VER }}/assets?name=RetroDECK.flatpak.sha"
        env:
          GITEA_TOKEN: ${{ secrets.GITEA_TRIGGER_BUILD_TOKEN }}
        continue-on-error: true # this will be in place until we reate an artifacts website that bypasses cloudflare limit