name: Release

on:
  push:
    tags:
      - "*"

permissions:
  contents: write

jobs:
  setup:
    name: Setup
    if: github.event.base_ref == 'refs/heads/master'
    runs-on: ubuntu-latest
    outputs:
      version: ${{ steps.get_version.outputs.version }}
    steps:
      - name: Get version
        id: get_version
        run: echo version=${GITHUB_REF/refs\/tags\//} >> $GITHUB_OUTPUT

  ubuntu-2404:
    # GitHub Actions' ubuntu-24.04 runner does not have enough RAM
    if: false
    name: Build Ubuntu 24.04 release
    needs:
      - setup
    runs-on: ubuntu-24.04
    env:
      DEBIAN_FRONTEND: noninteractive
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4
        with:
          submodules: recursive

      - name: Install dependencies
        run: |
          git submodule update --init --recursive
          sudo apt-get update
          sudo apt-get install -y --no-install-recommends \
              libavcodec-dev \
              libavdevice-dev \
              libavfilter-dev \
              libavformat-dev \
              libavutil-dev \
              libswscale-dev \
              libvulkan-dev \
              glslang-tools \
              libomp-dev \
              libboost-program-options-dev

      - name: Build Video2X
        run: |
          cmake -B build -S . -DCMAKE_BUILD_TYPE=Release \
            -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ \
            -DVIDEO2X_USE_EXTERNAL_NCNN=OFF -DVIDEO2X_USE_EXTERNAL_SPDLOG=OFF \
            -DCMAKE_INSTALL_PREFIX=build/video2x-linux-ubuntu-2404-amd64/usr
          cmake --build build --config Release --target install --parallel
          mkdir -p build/video2x-linux-ubuntu-2404-amd64/DEBIAN
          cp packaging/debian/control build/video2x-linux-ubuntu-2404-amd64/DEBIAN/control
          dpkg-deb --build build/video2x-linux-ubuntu-2404-amd64

      - name: Upload artifacts
        uses: actions/upload-artifact@v4
        with:
          name: video2x-linux-ubuntu-2404-amd64
          path: build/video2x-linux-ubuntu-2404-amd64.deb

  windows:
    # Disabled because it takes too long to build
    if: false
    name: Build Windows release
    needs:
      - setup
    runs-on: windows-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4
        with:
          submodules: recursive

      - name: Install Vulkan SDK
        uses: humbletim/setup-vulkan-sdk@v1.2.0
        with:
          vulkan-query-version: 1.3.204.0
          vulkan-components: Vulkan-Headers, Vulkan-Loader, Glslang, SPIRV-Tools, SPIRV-Headers
          vulkan-use-cache: true

      - name: Install dependencies
        shell: pwsh
        run: |
          $ffmpegVersion = "7.1"
          $ncnnVersion = "20240820"

          git submodule update --init --recursive

          curl -Lo ffmpeg-shared.zip "https://github.com/GyanD/codexffmpeg/releases/download/$ffmpegVersion/ffmpeg-$ffmpegVersion-full_build-shared.zip"
          Expand-Archive -Path ffmpeg-shared.zip -DestinationPath third_party
          Rename-Item -Path "third_party/ffmpeg-$ffmpegVersion-full_build-shared" -NewName ffmpeg-shared

          curl -Lo ncnn-shared.zip "https://github.com/Tencent/ncnn/releases/download/$ncnnVersion/ncnn-$ncnnVersion-windows-vs2022-shared.zip"
          Expand-Archive -Path ncnn-shared.zip -DestinationPath third_party
          Rename-Item -Path "third_party/ncnn-$ncnnVersion-windows-vs2022-shared" -NewName ncnn-shared

      - name: Build Video2X
        shell: pwsh
        run: |
          cmake -S . -B build `
            -DVIDEO2X_USE_EXTERNAL_NCNN=OFF -DVIDEO2X_USE_EXTERNAL_SPDLOG=OFF -DVIDEO2X_USE_EXTERNAL_BOOST=OFF `
            -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=build/video2x_install
          cmake --build build --config Release --parallel --target install

      - name: Compress artifacts
        run: |
          Compress-Archive -Path build/video2x_install/* -DestinationPath build/video2x-windows-amd64.zip

      - name: Upload artifacts
        uses: actions/upload-artifact@v4
        with:
          name: video2x-windows-amd64
          path: build/video2x-windows-amd64.zip

  container:
    name: Build and upload container
    needs:
      - setup
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - uses: mr-smithers-excellent/docker-build-push@v5
        name: Build & push the Docker image
        with:
          registry: ghcr.io
          username: ${{ secrets.GHCR_USER }}
          password: ${{ secrets.GHCR_TOKEN }}
          dockerfile: packaging/docker/Dockerfile
          image: video2x
          tags: latest, ${{ needs.setup.outputs.version }}

  create-release:
    name: Create release
    needs:
      - setup
      # - ubuntu-2404
      # - windows
      - container
    runs-on: ubuntu-latest
    # outputs:
    #   upload_url: ${{ steps.create_release.outputs.upload_url }}
    steps:
      # - name: Download artifacts
      #   uses: actions/download-artifact@v4

      - name: Create release
        id: create_release
        uses: softprops/action-gh-release@v2
        with:
          token: ${{ secrets.GITHUB_TOKEN }}
          tag_name: ${{ needs.setup.outputs.version }}
          name: ${{ needs.setup.outputs.version }}
          draft: true
          prerelease: false