name: release Linux

on:
  workflow_dispatch:
    inputs:
      release_tag:
        required: false
        type: string
  push:
    branches:
      - master

permissions:
  contents: write

jobs:
  build:
    uses: ./.github/workflows/build.yml
    with:
      target: linux

  release-zip:
    if: inputs.release_tag != ''
    needs: build
    uses: ./.github/workflows/package-zip.yml
    with:
      target: linux
      release_tag: ${{ inputs.release_tag }}

  deb:
    name: build and release deb x64 & arm64
    if: |
      (github.event_name == 'workflow_dispatch' && inputs.release_tag != '') ||
      (github.event_name == 'push' && startsWith(github.ref, 'refs/tags/'))
    runs-on: ubuntu-24.04
    container: debian:13
    env:
      RELEASE_TAG: ${{ case(inputs.release_tag != '', inputs.release_tag, github.ref_name) }}

    steps:
    - name: Prepare tools (Debian)
      shell: bash
      run: |
        set -euo pipefail
        export DEBIAN_FRONTEND=noninteractive
        apt-get update
        apt-get install -y sudo git rsync findutils tar gzip unzip which curl jq wget file \
                           ca-certificates desktop-file-utils xdg-utils fakeroot dpkg-dev \
                           libc6 libgcc-s1 libstdc++6 zlib1g libicu-dev libssl-dev

    - name: Checkout repo (for scripts)
      uses: actions/checkout@v6
      with:
        submodules: 'recursive'
        fetch-depth: '0'

    - name: Ensure script permissions
      run: chmod 755 package-debian.sh

    - name: Package DEB (Debian-family)
      run: ./package-debian.sh "${RELEASE_TAG}" --arch all

    - name: Collect DEBs into workspace
      run: |
        mkdir -p "$GITHUB_WORKSPACE/dist/deb"
        rsync -av "$HOME/debbuild/" "$GITHUB_WORKSPACE/dist/deb/" || true
        find "$GITHUB_WORKSPACE/dist/deb" -name "v2rayn_*_amd64.deb" \
          -exec mv {} "$GITHUB_WORKSPACE/dist/deb/v2rayN-linux-64.deb" \; || true
        find "$GITHUB_WORKSPACE/dist/deb" -name "v2rayn_*_arm64.deb" \
          -exec mv {} "$GITHUB_WORKSPACE/dist/deb/v2rayN-linux-arm64.deb" \; || true
        echo "==== Dist tree ===="
        ls -R "$GITHUB_WORKSPACE/dist/deb" || true

    - name: Upload DEBs to release
      uses: svenstaro/upload-release-action@v2
      with:
        file: dist/deb/**/*.deb
        tag: ${{ env.RELEASE_TAG }}
        file_glob: true
        prerelease: true

  rpm:
    name: build and release rpm x64 & arm64
    if: |
      (github.event_name == 'workflow_dispatch' && inputs.release_tag != '') ||
      (github.event_name == 'push' && startsWith(github.ref, 'refs/tags/'))
    runs-on: ubuntu-24.04
    container: registry.access.redhat.com/ubi10/ubi
    env:
      RELEASE_TAG: ${{ case(inputs.release_tag != '', inputs.release_tag, github.ref_name) }}

    steps:
    - name: Prepare tools (Red Hat)
      shell: bash
      run: |
        set -euo pipefail

        . /etc/os-release
        EL_MAJOR="${VERSION_ID%%.*}"
        echo "EL_MAJOR=${EL_MAJOR}"

        dnf -y makecache || true
        command -v curl >/dev/null || dnf -y install curl ca-certificates

        ARCH="$(uname -m)"
        case "$ARCH" in x86_64|aarch64) ;; *) echo "Unsupported arch: $ARCH"; exit 1 ;; esac

        install_epel_from_dir() {
          local base="$1" rpm
          echo "Try: $base"

          rpm="$(
            {
              curl -fsSL "$base/Packages/"   2>/dev/null
              curl -fsSL "$base/Packages/e/" 2>/dev/null | sed 's|href="|href="e/|'
            } |
            sed -n 's/.*href="\([^"]*epel-release-[^"]*\.noarch\.rpm\)".*/\1/p' |
            sort -V | tail -n1
          )" || true

          if [[ -n "$rpm" ]]; then
            dnf -y install "$base/Packages/$rpm"
            return 0
          fi
          return 1
        }

        FEDORA="https://dl.fedoraproject.org/pub/epel/epel-release-latest-${EL_MAJOR}.noarch.rpm"
        echo "Try Fedora: $FEDORA"

        if curl -fsSLI "$FEDORA" >/dev/null; then
          dnf -y install "$FEDORA"
        else
          ROCKY="https://dl.rockylinux.org/pub/rocky/${EL_MAJOR}/extras/${ARCH}/os"
          if install_epel_from_dir "$ROCKY"; then
            :
          else
            ALMA="https://repo.almalinux.org/almalinux/${EL_MAJOR}/extras/${ARCH}/os"
            if install_epel_from_dir "$ALMA"; then
              :
            else
              echo "EPEL bootstrap failed (Fedora/Rocky/Alma)"
              exit 1
            fi
          fi
        fi

        dnf -y install sudo git rpm-build rpmdevtools dnf-plugins-core \
                       rsync findutils tar gzip unzip which

        dnf repolist | grep -i epel || true

    - name: Checkout repo (for scripts)
      uses: actions/checkout@v6
      with:
        submodules: 'recursive'
        fetch-depth: '0'

    - name: Ensure script permissions
      run: chmod 755 package-rhel.sh

    - name: Package RPM (RHEL-family)
      run: ./package-rhel.sh "${RELEASE_TAG}" --arch all

    - name: Collect RPMs into workspace
      run: |
        mkdir -p "$GITHUB_WORKSPACE/dist/rpm"
        rsync -av "$HOME/rpmbuild/RPMS/" "$GITHUB_WORKSPACE/dist/rpm/" || true
        find "$GITHUB_WORKSPACE/dist/rpm" -name "v2rayN-*-1*.x86_64.rpm"  -exec mv {} "$GITHUB_WORKSPACE/dist/rpm/v2rayN-linux-rhel-64.rpm" \;  || true
        find "$GITHUB_WORKSPACE/dist/rpm" -name "v2rayN-*-1*.aarch64.rpm" -exec mv {} "$GITHUB_WORKSPACE/dist/rpm/v2rayN-linux-rhel-arm64.rpm" \; || true
        echo "==== Dist tree ===="
        ls -R "$GITHUB_WORKSPACE/dist/rpm" || true

    - name: Upload RPMs to release
      uses: svenstaro/upload-release-action@v2
      with:
        file: dist/rpm/**/*.rpm
        tag: ${{ env.RELEASE_TAG }}
        file_glob: true
        prerelease: true

  rpm-riscv64:
    name: build and release rpm riscv64
    if: |
      (github.event_name == 'workflow_dispatch' && inputs.release_tag != '') ||
      (github.event_name == 'push' && startsWith(github.ref, 'refs/tags/'))
    runs-on: ubuntu-24.04-riscv
    container: rockylinux/rockylinux:10
    env:
      RELEASE_TAG: ${{ case(inputs.release_tag != '', inputs.release_tag, github.ref_name) }}

    steps:
    - name: Prepare tools (Red Hat)
      shell: bash
      run: |
        set -euo pipefail
        dnf -y makecache
        dnf -y install \
          sudo git rpm-build rpmdevtools dnf-plugins-core \
          rsync findutils tar gzip unzip which jq

    - name: Checkout repo (for scripts)
      shell: bash
      env:
        GITHUB_TOKEN: ${{ github.token }}
      run: |
        set -euo pipefail
        rm -rf ./*
        git init .
        git config --global --add safe.directory "$PWD"
        git remote add origin "https://x-access-token:${GITHUB_TOKEN}@github.com/${GITHUB_REPOSITORY}.git"
        git fetch --depth=1 origin "${GITHUB_SHA}"
        git checkout FETCH_HEAD
        git submodule update --init --recursive

    - name: Ensure script permissions
      run: chmod 755 package-rhel-riscv.sh

    - name: Package RPM (RHEL-family)
      run: ./package-rhel-riscv.sh "${RELEASE_TAG}"

    - name: Collect RPMs into workspace
      run: |
        mkdir -p "$GITHUB_WORKSPACE/dist/rpm-riscv64"
        rsync -av "$HOME/rpmbuild/RPMS/" "$GITHUB_WORKSPACE/dist/rpm-riscv64/" || true
        find "$GITHUB_WORKSPACE/dist/rpm-riscv64" -name "*.riscv64.rpm" \
          -exec mv {} "$GITHUB_WORKSPACE/dist/rpm-riscv64/v2rayN-linux-rhel-riscv64.rpm" \; || true
        echo "==== Dist tree ===="
        ls -R "$GITHUB_WORKSPACE/dist/rpm-riscv64" || true

    - name: Upload RPMs to release
      shell: bash
      env:
        GITHUB_TOKEN: ${{ github.token }}
      run: |
        set -euo pipefail
        shopt -s globstar nullglob

        files=(dist/rpm-riscv64/**/*.rpm)
        (( ${#files[@]} )) || { echo "No RPMs found."; exit 1; }

        api="${GITHUB_API_URL}/repos/${GITHUB_REPOSITORY}/releases/tags/${RELEASE_TAG}"
        upload_url="$(curl -fsSL -H "Authorization: Bearer ${GITHUB_TOKEN}" "$api" | jq -r '.upload_url // empty' | sed 's/{?name,label}//')"
        [[ "$upload_url" ]] || { echo "Release upload URL not found: ${RELEASE_TAG}"; exit 1; }

        for f in "${files[@]}"; do
          echo "Uploading ${f##*/}"
          curl -fsSL -X POST \
            -H "Authorization: Bearer ${GITHUB_TOKEN}" \
            -H "Content-Type: application/x-rpm" \
            --data-binary @"$f" \
            "${upload_url}?name=${f##*/}"
        done

  deb-riscv64:
    name: build and release deb riscv64
    if: |
      (github.event_name == 'workflow_dispatch' && inputs.release_tag != '') ||
      (github.event_name == 'push' && startsWith(github.ref, 'refs/tags/'))
    runs-on: ubuntu-24.04-riscv
    container: debian:13
    env:
      RELEASE_TAG: ${{ case(inputs.release_tag != '', inputs.release_tag, github.ref_name) }}

    steps:
    - name: Prepare tools (Debian)
      shell: bash
      run: |
        set -euo pipefail
        export DEBIAN_FRONTEND=noninteractive
        apt-get update
        apt-get install -y sudo git rsync findutils tar gzip unzip which curl jq wget file \
                           ca-certificates desktop-file-utils xdg-utils fakeroot dpkg-dev \
                           gcc make libc6-dev libgcc-s1 libstdc++6 zlib1g libatomic1

    - name: Checkout repo (for scripts)
      shell: bash
      env:
        GITHUB_TOKEN: ${{ github.token }}
      run: |
        set -euo pipefail
        rm -rf ./*
        git init .
        git config --global --add safe.directory "$PWD"
        git remote add origin "https://x-access-token:${GITHUB_TOKEN}@github.com/${GITHUB_REPOSITORY}.git"
        git fetch --depth=1 origin "${GITHUB_SHA}"
        git checkout FETCH_HEAD
        git submodule update --init --recursive

    - name: Ensure script permissions
      run: chmod 755 package-debian-riscv.sh

    - name: Package DEB (Debian-family)
      run: ./package-debian-riscv.sh "${RELEASE_TAG}"

    - name: Collect DEBs into workspace
      run: |
        mkdir -p "$GITHUB_WORKSPACE/dist/deb-riscv64"
        rsync -av "$HOME/debbuild/" "$GITHUB_WORKSPACE/dist/deb-riscv64/" || true
        find "$GITHUB_WORKSPACE/dist/deb-riscv64" -name "*.deb" \
          -exec mv {} "$GITHUB_WORKSPACE/dist/deb-riscv64/v2rayN-linux-riscv64.deb" \; || true
        echo "==== Dist tree ===="
        ls -R "$GITHUB_WORKSPACE/dist/deb-riscv64" || true

    - name: Upload DEBs to release
      shell: bash
      env:
        GITHUB_TOKEN: ${{ github.token }}
      run: |
        set -euo pipefail
        shopt -s globstar nullglob

        files=(dist/deb-riscv64/**/*.deb)
        (( ${#files[@]} )) || { echo "No DEBs found."; exit 1; }

        api="${GITHUB_API_URL}/repos/${GITHUB_REPOSITORY}/releases/tags/${RELEASE_TAG}"
        upload_url="$(curl -fsSL -H "Authorization: Bearer ${GITHUB_TOKEN}" "$api" | jq -r '.upload_url // empty' | sed 's/{?name,label}//')"
        [[ "$upload_url" ]] || { echo "Release upload URL not found: ${RELEASE_TAG}"; exit 1; }

        for f in "${files[@]}"; do
          echo "Uploading ${f##*/}"
          curl -fsSL -X POST \
            -H "Authorization: Bearer ${GITHUB_TOKEN}" \
            -H "Content-Type: application/vnd.debian.binary-package" \
            --data-binary @"$f" \
            "${upload_url}?name=${f##*/}"
        done
