# Maintainer:

_pkgname="ymir-emu"
pkgname="$_pkgname-git"
pkgver=0.3.3.r179.g2f135da
pkgrel=1
pkgdesc="Sega Saturn emulator"
url="https://github.com/StrikerX3/Ymir"
license=('GPL-3.0-only')
arch=('x86_64')

depends=(
  'librtmidi.so' # rtmidi
  'miniz'
  'sdl3'
)
makedepends=(
  'cereal'
  'chrono-date'
  'cmake'
  'cxxopts'
  'git'
  'libngtcp2'
  'ninja'
  'nlohmann-json'
  'stb'
  'tomlplusplus'
)

provides=("$_pkgname")
conflicts=("$_pkgname")

_pkgsrc="$_pkgname"
source=(
  "$_pkgsrc"::"git+$url.git"
  "neargye-semver"::"git+https://github.com/Neargye/semver.git#tag=v1.0.0"
  '0001_fix_for_semver_1.0.0.patch'
)
sha256sums=(
  'SKIP'
  '83de76116a904754b906fff4628e81a724a8dcde6ee10a84b990a0798f82e911'
  '08b47f2a3f149b144908febe4ffda18f24419494011b1a72ee584a9396993f0d'
)

prepare() {
  cd "$_pkgsrc"
  git rm -r vendor/lz4/lz4
  git submodule update --init --recursive --depth=1

  # prevent wayland scaling bug
  sed -e '/int main/r /dev/stdin' -i apps/ymir-sdl3/src/main.cpp << 'END'
const char* disp = getenv("DISPLAY");
bool x11_supported = false;

int n = SDL_GetNumVideoDrivers();
for (int i = 0; i < n; i++) {
  const char* driver = SDL_GetVideoDriver(i);
  if (driver && strcmp(driver, "x11") == 0) {
    x11_supported = true;
    break;
  }
}

if (disp && *disp && x11_supported) {
  setenv("SDL_VIDEODRIVER", "x11", 0);
}
END

  # allow find modules; config may not exist
  sed -E -e '/find_package/s&\bCONFIG\b&&g' \
    -i apps/ymir-sandbox/CMakeLists.txt \
    apps/ymir-sdl3/CMakeLists.txt

  # set location of cmake modules
  sed -e '1i list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")' -i apps/CMakeLists.txt

  # add missing include
  sed -e '1a include_directories(${CMAKE_SOURCE_DIR}/../neargye-semver/include)' -i apps/CMakeLists.txt

  # stb is header only
  sed -E -e '/find_package\(Stb/d' \
    -i apps/ymir-sandbox/CMakeLists.txt \
    apps/ymir-sdl3/CMakeLists.txt

  # don't force libcurl_static
  sed -E -e 's&(CURL::libcurl)_static\b&\1&' \
    -i apps/ymir-sandbox/CMakeLists.txt \
    apps/ymir-sdl3/CMakeLists.txt

  # don't force libzstd_static
  sed -E -e 's&(zstd::libzstd)_static\b&\1&' \
    -i vendor/libchdr/CMakeLists.txt

  # fix type mismatch
  sed -E -e '/m_m68kClockShift = std::min/s&4ull&uint64{4}&' -i libs/ymir-core/include/ymir/hw/scsp/scsp.hpp

  # use system lz4
  sed -E -e '/lz4/d' -i vendor/CMakeLists.txt
  sed -e '1i find_package(LZ4)' -i apps/ymir-sdl3/CMakeLists.txt

  # find module for lz4
  cat > cmake/FindLZ4.cmake << 'END'
find_path(LZ4_INCLUDE_DIR NAMES lz4.h)
find_library(LZ4_LIBRARY NAMES lz4)

include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(LZ4 DEFAULT_MSG
  LZ4_LIBRARY LZ4_INCLUDE_DIR
)

if(LZ4_FOUND AND NOT TARGET lz4::lz4)
  add_library(lz4::lz4 UNKNOWN IMPORTED)
  set_target_properties(lz4::lz4 PROPERTIES
    IMPORTED_LOCATION "${LZ4_LIBRARY}"
    INTERFACE_INCLUDE_DIRECTORIES "${LZ4_INCLUDE_DIR}"
  )
endif()
END

  # find module for rtmidi
  cat > cmake/Findrtmidi.cmake << 'END'
find_path(RTMIDI_INCLUDE_DIR RtMidi.h
  PATH_SUFFIXES rtmidi
)
find_library(RTMIDI_LIBRARY NAMES rtmidi)

include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(RtMidi DEFAULT_MSG
  RTMIDI_INCLUDE_DIR RTMIDI_LIBRARY
)

if(RTMIDI_FOUND)
  add_library(RtMidi::rtmidi UNKNOWN IMPORTED)
  set_target_properties(RtMidi::rtmidi PROPERTIES
    IMPORTED_LOCATION "${RTMIDI_LIBRARY}"
    INTERFACE_INCLUDE_DIRECTORIES "${RTMIDI_INCLUDE_DIR}"
  )
endif()
END

  local src
  for src in "${source[@]}"; do
    src="${src%%::*}"
    src="${src##*/}"
    src="${src%.zst}"
    if [[ $src == *.patch ]]; then
      printf '\nApplying patch: %s\n' "$src"
      patch -Np1 -F100 -i "${srcdir:?}/$src"
    fi
  done
}

pkgver() {
  cd "$_pkgsrc"
  git describe --long --tags --abbrev=7 --exclude='*[a-zA-Z][a-zA-Z]*' \
    | sed -E 's/^[^0-9]*//;s/([^-]*-g)/r\1/;s/-/./g'
}

build() {
  local _cmake_options=(
    -B build
    -S "$_pkgsrc"
    -G Ninja
    -DCMAKE_BUILD_TYPE=None
    -DCMAKE_INSTALL_PREFIX='/usr'
    -Wno-dev

    -DYmir_ENABLE_DEVLOG=OFF
    -DYmir_ENABLE_IMGUI_DEMO=OFF
    -DYmir_ENABLE_IPO=OFF
    -DYmir_ENABLE_TESTS=$CHECKFUNC
    -DYmir_ENABLE_UPDATE_CHECKS=OFF
    -DYmir_EXTRA_INLINING=OFF

    -DYmir_DEV_BUILD=OFF
    -DYmir_VERSION_PRERELEASE=AUR

    # extra binaries
    -DYmir_ENABLE_SANDBOX=OFF
    -DYmir_ENABLE_YMDASM=OFF

    -DStb_INCLUDE_DIR=/usr/include/stb
  )

  # Edit /etc/makepkg.conf to enable AVX2
  if g++ -x c++ - $CXXFLAGS -o /dev/null &> /dev/null << 'END'; then
#include <immintrin.h>
int main() {
  __m256i v = _mm256_add_epi32(_mm256_set1_epi32(1), _mm256_set1_epi32(2));
  (void)v;
  return 0;
}
END
    _cmake_options+=(-DYmir_AVX2=ON)
  else
    _cmake_options+=(-DYmir_AVX2=OFF)
  fi

  cmake "${_cmake_options[@]}"
  cmake --build build
}

package() {
  # binary
  install -Dm755 "$(realpath build/apps/ymir-sdl3/ymir-sdl3)" "$pkgdir/usr/bin/$_pkgname"

  # license
  install -Dm644 "$_pkgsrc/LICENSE" -t "$pkgdir/usr/share/licenses/$pkgname"

  # icon
  install -Dm644 "$_pkgsrc"/apps/ymir-sdl3/res/ymir.png "$pkgdir/usr/share/pixmaps/$_pkgname.png"

  # launcher
  install -Dm644 /dev/stdin "$pkgdir/usr/share/applications/$_pkgname.desktop" << END
[Desktop Entry]
Type=Application
Name=ymir
GenericName=$_pkgdesc
Comment=$_pkgdesc
Exec=$_pkgname
Icon=$_pkgname
StartupWMClass=$_pkgname
Categories=Game;Emulator;
END
}
