name: Release

on:
  workflow_dispatch:
    inputs:
      version:
        description: "Version (SemVer)"
        required: true
        default: 0.0.0
      deployment-aur-gui:
        description: "Deployment (AUR, GUI)"
        type: boolean
        required: true
        default: true
      deployment-aur-cli:
        description: "Deployment (AUR, CLI)"
        type: boolean
        required: true
        default: true
      deploy-latest-version:
        description: "Deploy to Latest-Version-Repo"
        type: boolean
        required: true
        default: true
      deploy-major-version:
        description: "Deploy to Major-Version-Repo"
        type: boolean
        required: true
        default: true
      is-preprelease:
        description: "Is a Pre-Release"
        type: boolean
        required: true
        default: false
      is-latest:
        description: "Is the latest release"
        type: boolean
        required: true
        default: true

env:
  CARGO_TERM_COLOR: always

jobs:
  update-version:
    name: Update version
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v5
        with:
          fetch-depth: 0
          token: ${{ secrets.BOT_TOKEN }}

      - name: Install cargo-edit
        run: cargo install cargo-edit

      - name: Update package version
        run: cargo set-version ${{ github.event.inputs.version }}

      - name: Upload working directory with current version-number
        uses: actions/upload-artifact@v6
        with:
          name: versioned-build
          include-hidden-files: true
          path: .
          retention-days: 1

  build:
    name: Build
    runs-on: ubuntu-latest
    needs: [update-version]
    steps:
      - name: Download working directory with current version-number
        uses: actions/download-artifact@v7
        with:
          name: versioned-build
          path: .

      - name: Build binary
        run: cargo build --release --all-features

      - name: Upload build artifacts
        uses: actions/upload-artifact@v6
        with:
          name: build-artifact
          include-hidden-files: true
          path: .
          retention-days: 1

  update-metadata:
    name: Update metadata
    runs-on: ubuntu-latest
    needs: [update-version]
    steps:
      - name: Download build artifacts
        uses: actions/download-artifact@v7
        with:
          name: versioned-build

      - name: Generate tarball from current repo
        run: |
          VERSION=${{ github.event.inputs.version }}
          git config --global user.name 'OpenFoxes Maintenance Bot'
          git config --global user.email 'openfoxes@bono-fox.de'
          git init
          git add .
          git commit -m "🔖 Set version number to ${{  github.event.inputs.version }}"
          git archive --format=tar.gz -o tiny4linux-${VERSION}.tar.gz HEAD
          git archive --format=zip -o tiny4linux-${VERSION}.zip HEAD

      - name: Extract major version
        id: vars
        run: |
          VERSION="${{ github.event.inputs.version }}"
          echo "major=${VERSION%%.*}" >> $GITHUB_OUTPUT

      - name: Update PKGBUILD & SRCINFO for the GUI (Latest-Repo) with new version and SHA
        if: ${{ github.event.inputs.deployment-aur-gui == 'true' && github.event.inputs.deploy-latest-version == 'true' }}
        run: |
          VERSION=${{ github.event.inputs.version }}
          sha=$(sha256sum tiny4linux-${VERSION}.tar.gz | cut -d' ' -f1)

          cd deployment/gui/aur

          sed -i "s/^pkgver=.*/pkgver=${VERSION}/" PKGBUILD
          sed -i "s/^pkgrel=.*/pkgrel=1/" PKGBUILD
          sed -i "s/^sha256sums=.*/sha256sums=('${sha}')/" PKGBUILD

          # Write-Permissions for Container-User
          chmod -R 777 .

          docker run --rm -v $PWD:/pkg archlinux:latest bash -c "
            pacman -Sy --noconfirm --needed base-devel shadow &&
            useradd -m builder || true &&
            chown -R builder:builder /pkg &&
            cd /pkg &&
            su - builder -c 'cd /pkg && makepkg --printsrcinfo > .SRCINFO'
          "

      - name: Update PKGBUILD & SRCINFO for the GUI (Major-Repo) with new version and SHA
        if: ${{ github.event.inputs.deployment-aur-gui == 'true' && github.event.inputs.deploy-major-version == 'true' }}
        run: |
          VERSION=${{ github.event.inputs.version }}
          MAJOR=${{ steps.vars.outputs.major }}
          sha=$(sha256sum tiny4linux-${VERSION}.tar.gz | cut -d' ' -f1)

          cd deployment/gui/aur-major

          sed -i "s/^pkgname=.*/pkgname=tiny4linux-gui-v${MAJOR}/" PKGBUILD
          sed -i "s/^pkgver=.*/pkgver=${VERSION}/" PKGBUILD
          sed -i "s/^pkgrel=.*/pkgrel=1/" PKGBUILD
          sed -i "s/^sha256sums=.*/sha256sums=('${sha}')/" PKGBUILD

          # Write-Permissions for Container-User
          chmod -R 777 .

          docker run --rm -v $PWD:/pkg archlinux:latest bash -c "
            pacman -Sy --noconfirm --needed base-devel shadow &&
            useradd -m builder || true &&
            chown -R builder:builder /pkg &&
            cd /pkg &&
            su - builder -c 'cd /pkg && makepkg --printsrcinfo > .SRCINFO'
          "

      - name: Update PKGBUILD & SRCINFO for the CLI (Latest-Repo) with new version and SHA
        if: ${{ github.event.inputs.deployment-aur-cli == 'true' && github.event.inputs.deploy-latest-version == 'true' }}
        run: |
          VERSION=${{ github.event.inputs.version }}
          sha=$(sha256sum tiny4linux-${VERSION}.tar.gz | cut -d' ' -f1)

          cd deployment/cli/aur

          sed -i "s/^pkgver=.*/pkgver=${VERSION}/" PKGBUILD
          sed -i "s/^pkgrel=.*/pkgrel=1/" PKGBUILD
          sed -i "s/^sha256sums=.*/sha256sums=('${sha}')/" PKGBUILD

          # Write-Permissions for Container-User
          chmod -R 777 .

          docker run --rm -v $PWD:/pkg archlinux:latest bash -c "
            pacman -Sy --noconfirm --needed base-devel shadow &&
            useradd -m builder || true &&
            chown -R builder:builder /pkg &&
            cd /pkg &&
            su - builder -c 'cd /pkg && makepkg --printsrcinfo > .SRCINFO'
          "

      - name: Update PKGBUILD & SRCINFO for the CLI (Major-Repo) with new version and SHA
        if: ${{ github.event.inputs.deployment-aur-cli == 'true' && github.event.inputs.deploy-major-version == 'true' }}
        run: |
          VERSION=${{ github.event.inputs.version }}
          MAJOR=${{ steps.vars.outputs.major }}
          sha=$(sha256sum tiny4linux-${VERSION}.tar.gz | cut -d' ' -f1)

          cd deployment/cli/aur-major

          sed -i "s/^pkgname=.*/pkgname=tiny4linux-cli-v${MAJOR}/" PKGBUILD
          sed -i "s/^pkgver=.*/pkgver=${VERSION}/" PKGBUILD
          sed -i "s/^pkgrel=.*/pkgrel=1/" PKGBUILD
          sed -i "s/^sha256sums=.*/sha256sums=('${sha}')/" PKGBUILD

          # Write-Permissions for Container-User
          chmod -R 777 .

          docker run --rm -v $PWD:/pkg archlinux:latest bash -c "
            pacman -Sy --noconfirm --needed base-devel shadow &&
            useradd -m builder || true &&
            chown -R builder:builder /pkg &&
            cd /pkg &&
            su - builder -c 'cd /pkg && makepkg --printsrcinfo > .SRCINFO'
          "

      - name: Upload tarballs and metadata
        uses: actions/upload-artifact@v6
        with:
          name: tarballs
          include-hidden-files: true
          path: |
            tiny4linux-${{ github.event.inputs.version }}.tar.gz
            tiny4linux-${{ github.event.inputs.version }}.zip
            deployment/gui/aur/PKGBUILD
            deployment/gui/aur/.SRCINFO
            deployment/gui/aur/LICENSE
            deployment/cli/aur/PKGBUILD
            deployment/cli/aur/.SRCINFO
            deployment/cli/aur/LICENSE
            deployment/gui/aur-major/PKGBUILD
            deployment/gui/aur-major/.SRCINFO
            deployment/gui/aur-major/LICENSE
            deployment/cli/aur-major/PKGBUILD
            deployment/cli/aur-major/.SRCINFO
            deployment/cli/aur-major/LICENSE
          retention-days: 1

  add-version-commit:
    name: Add version commit
    runs-on: ubuntu-latest
    needs: [update-version, update-metadata]
    steps:
      - name: Download working directory with current version-number
        uses: actions/download-artifact@v7
        with:
          name: versioned-build
          path: .

      - name: Download updated metadata
        uses: actions/download-artifact@v7
        with:
          name: tarballs
          path: .

      - name: Add a commit
        run: |
          git config --global user.name 'OpenFoxes Maintenance Bot'
          git config --global user.email 'openfoxes@bono-fox.de'
          git init
          git add .
          git commit -m "🔖 Release Tiny4Linux ${{  github.event.inputs.version }}"
          git tag v${{  github.event.inputs.version }}
          git push -u origin HEAD:main --tags

  create-github-release:
    name: "Create GitHub release"
    runs-on: ubuntu-latest
    needs: [build, update-metadata, add-version-commit]
    steps:
      - name: Download build artifacts
        uses: actions/download-artifact@v7
        with:
          name: build-artifact
          path: .

      - name: Download metadata
        uses: actions/download-artifact@v7
        with:
          name: tarballs
          path: .

      - uses: softprops/action-gh-release@v2
        with:
          token: ${{ secrets.BOT_TOKEN }}
          name: Version ${{  github.event.inputs.version }}
          tag_name: v${{  github.event.inputs.version }}
          body_path: ${{ github.workspace }}/changelogs/${{  github.event.inputs.version }}.md
          prerelease: ${{ github.event.inputs.is-preprelease }}
          make_latest: ${{ github.event.inputs.is-latest && !github.event.inputs.is-preprelease }}
          files: |
            target/release/tiny4linux-gui
            target/release/tiny4linux-cli
            tiny4linux-${{ github.event.inputs.version }}.tar.gz
            tiny4linux-${{ github.event.inputs.version }}.zip

  deploy-aur-gui:
    name: "Deploy GUI to AUR"
    runs-on: ubuntu-latest
    if: ${{ github.event.inputs.deployment-aur-gui == 'true' && github.event.inputs.deploy-latest-version == 'true' }}
    needs: [create-github-release]
    steps:
      - name: Setup SSH for AUR
        run: |
          mkdir -p ~/.ssh
          echo "${{ secrets.AUR_SSH_PRIVATE_KEY }}" > ~/.ssh/id_ed25519
          chmod 600 ~/.ssh/id_ed25519
          ssh-keyscan aur.archlinux.org >> ~/.ssh/known_hosts

      - name: Clone AUR repository
        run: |
          git clone ssh://aur@aur.archlinux.org/tiny4linux-gui.git aur-repo

      - name: Download packed tarballs and metadata
        uses: actions/download-artifact@v7
        with:
          name: tarballs
          path: aur-repo

      - name: Commit & Push to the AUR
        working-directory: aur-repo
        run: |
          cp -a deployment/gui/aur/. .
          git config user.name "OpenFoxes Maintenance Bot"
          git config user.email "openfoxes@bono-fox.de"
          git add PKGBUILD .SRCINFO LICENSE
          git commit -m "Update to Version ${{ github.event.inputs.version }}"
          git push

  deploy-aur-gui-major:
    name: "Deploy GUI to AUR (Major-Version Repo)"
    runs-on: ubuntu-latest
    if: ${{ github.event.inputs.deployment-aur-gui == 'true' && github.event.inputs.deploy-major-version == 'true' }}
    needs: [create-github-release]
    steps:
      - name: Extract major version
        id: vars
        run: |
          VERSION="${{ github.event.inputs.version }}"
          echo "major=${VERSION%%.*}" >> $GITHUB_OUTPUT

      - name: Setup SSH for AUR
        run: |
          mkdir -p ~/.ssh
          echo "${{ secrets.AUR_SSH_PRIVATE_KEY }}" > ~/.ssh/id_ed25519
          chmod 600 ~/.ssh/id_ed25519
          ssh-keyscan aur.archlinux.org >> ~/.ssh/known_hosts

      - name: Clone AUR repository
        run: |
          git clone ssh://aur@aur.archlinux.org/tiny4linux-gui-v${{ steps.vars.outputs.major }}.git aur-repo

      - name: Download packed tarballs and metadata
        uses: actions/download-artifact@v7
        with:
          name: tarballs
          path: aur-repo

      - name: Commit & Push to the AUR
        working-directory: aur-repo
        run: |
          cp -a deployment/gui/aur-major/. .
          git config user.name "OpenFoxes Maintenance Bot"
          git config user.email "openfoxes@bono-fox.de"
          git add PKGBUILD .SRCINFO LICENSE
          git commit -m "Update V${{ steps.vars.outputs.major }}-Repo to Version ${{ github.event.inputs.version }}"
          git push

  deploy-aur-cli:
    name: "Deploy CLI to AUR"
    runs-on: ubuntu-latest
    if: ${{ github.event.inputs.deployment-aur-cli == 'true' && github.event.inputs.deploy-latest-version == 'true' }}
    needs: [create-github-release]
    steps:
      - name: Setup SSH for AUR
        run: |
          mkdir -p ~/.ssh
          echo "${{ secrets.AUR_SSH_PRIVATE_KEY }}" > ~/.ssh/id_ed25519
          chmod 600 ~/.ssh/id_ed25519
          ssh-keyscan aur.archlinux.org >> ~/.ssh/known_hosts

      - name: Clone AUR repository
        run: |
          git clone ssh://aur@aur.archlinux.org/tiny4linux-cli.git aur-repo

      - name: Download packed tarballs and metadata
        uses: actions/download-artifact@v7
        with:
          name: tarballs
          path: aur-repo

      - name: Commit & Push to the AUR
        working-directory: aur-repo
        run: |
          cp -a deployment/cli/aur/. .
          git config user.name "OpenFoxes Maintenance Bot"
          git config user.email "openfoxes@bono-fox.de"
          git add PKGBUILD .SRCINFO LICENSE
          git commit -m "Update to Version ${{ github.event.inputs.version }}"
          git push

  deploy-aur-cli-major:
    name: "Deploy CLI to AUR (Major-Version Repo)"
    runs-on: ubuntu-latest
    if: ${{ github.event.inputs.deployment-aur-cli == 'true' && github.event.inputs.deploy-major-version == 'true' }}
    needs: [create-github-release]
    steps:
      - name: Extract major version
        id: vars
        run: |
          VERSION="${{ github.event.inputs.version }}"
          echo "major=${VERSION%%.*}" >> $GITHUB_OUTPUT

      - name: Setup SSH for AUR
        run: |
          mkdir -p ~/.ssh
          echo "${{ secrets.AUR_SSH_PRIVATE_KEY }}" > ~/.ssh/id_ed25519
          chmod 600 ~/.ssh/id_ed25519
          ssh-keyscan aur.archlinux.org >> ~/.ssh/known_hosts

      - name: Clone AUR repository
        run: |
          git clone ssh://aur@aur.archlinux.org/tiny4linux-cli-v${{ steps.vars.outputs.major }}.git aur-repo

      - name: Download packed tarballs and metadata
        uses: actions/download-artifact@v7
        with:
          name: tarballs
          path: aur-repo

      - name: Commit & Push to the AUR
        working-directory: aur-repo
        run: |
          cp -a deployment/cli/aur-major/. .
          git config user.name "OpenFoxes Maintenance Bot"
          git config user.email "openfoxes@bono-fox.de"
          git add PKGBUILD .SRCINFO LICENSE
          git commit -m "Update V${{ steps.vars.outputs.major }}-Repo to Version ${{ github.event.inputs.version }}"
          git push

  cleanup:
    name: Cleanup
    runs-on: ubuntu-latest
    needs:
      [
        deploy-aur-gui,
        deploy-aur-cli,
        deploy-aur-gui-major,
        deploy-aur-cli-major,
      ]
    steps:
      - name: Delete artifacts
        uses: geekyeggo/delete-artifact@v5
        with:
          name: |
            versioned-build
            build-artifact
            tarballs
