_realname=ollama
pkgbase=mingw-w64-${_realname}
pkgname="${MINGW_PACKAGE_PREFIX}-${_realname}"
pkgdesc='Create, run and share large language models (LLMs) (mingw-w64)'
pkgver=0.1.44
pkgrel=1
arch=(any)
mingw_arch=('mingw64' 'ucrt64' 'clang64' 'clangarm64')
url='https://ollama.com'
license=('spdx:MIT')
makedepends=(git
             ${MINGW_PACKAGE_PREFIX}-cmake
             ${MINGW_PACKAGE_PREFIX}-go
             ${MINGW_PACKAGE_PREFIX}-gcc
             ${MINGW_PACKAGE_PREFIX}-make)
source=(git+https://github.com/ollama/ollama/#tag=v$pkgver
        0002-remove-cmake-arch.patch
        0003-missing-main.patch
)
b2sums=('cadb0df81c9e6d2941ad31b4b7b0e901da98174c9f5c37c65e911d7ee3cad2601fb8b070406d97535f592a5164f0c5da82a6f3f3b065e2bc3dab3ee09f532399'
        '1c002778e73548a762cb306024ee3920d767eaa284ee33673594fe83fac39a4bb119125e2c6513ac13ebb8fc540abb7ab18edb52f6f659d37cfb689f8af896b5'
        '013f57a5193142509d20c2fc0053442291f067d8993293ca77760f712959910313c7210027c49ef206288e7fe0299715f071a6c99f46071288617ff511351818')

apply_patch_with_msg() {
  for _patch in "$@"
  do
    msg2 "Applying ${_patch}"
    patch -Nbp1 -i "${srcdir}/${_patch}"
  done
}

prepare() {
  cd $_realname

  apply_patch_with_msg \
    ../0002-remove-cmake-arch.patch \
    ../0003-missing-main.patch

  if check_option "debug" "n"; then
    sed -i 's,var mode string = gin.DebugMode,var mode string = gin.ReleaseMode,g' server/routes.go
  fi  
}

build() {
  cd $_realname
  export CGO_CFLAGS="$CFLAGS" CGO_CPPFLAGS="$CPPFLAGS" CGO_CXXFLAGS="$CXXFLAGS" CGO_LDFLAGS="$LDFLAGS"
  export GOPROXY=direct 
  export GOROOT=${MINGW_PREFIX}/lib/go
  export GOPATH=${MINGW_PREFIX}/

  if [[ ${CARCH} == aarch64 ]]; then
    # See https://github.com/ggerganov/llama.cpp/blob/4ee7a17d09cda02a76f865dcc73237f3b9a09fac/cmake/arm64-windows-llvm.cmake#L12
    local flags="-march=armv8.2-a -fvectorize -ffp-model=fast"

    export CMAKE_C_FLAGS_INIT="$flags"
    export CMAKE_CXX_FLAGS_INIT="$flags"
  fi
  
  go generate ./...
  go build -buildmode=pie -trimpath -mod=readonly -modcacherw -ldflags=-linkmode=external \
    -ldflags=-buildid='' -ldflags="-X=github.com/ollama/ollama/version.Version=$pkgver" -o "${srcdir}/build-${MSYSTEM}/"
}

check() {
  $srcdir/build-$MSYSTEM/ollama --version >/dev/null

  cd $_realname
  go test .
}

package() {
  cd $srcdir/build-$MSYSTEM

  mkdir -p "${pkgdir}${MINGW_PREFIX}/bin"
  install ollama.exe -t"${pkgdir}${MINGW_PREFIX}/bin"

  local runners=("cpu")
  local dist_arch=$([[ ${CARCH} == aarch64 ]] && echo "arm64" || echo "amd64")

  # ARM64 only supports 'cpu' which has NEON enabled by default
  if [[ ${CARCH} != aarch64 ]]; then
    runners+=("cpu_avx" "cpu_avx2")
  fi

  for runner in "${runners[@]}"
  do
    install -D "$srcdir/$_realname/dist/windows-$dist_arch/ollama_runners/$runner/libllama.dll" "${pkgdir}${MINGW_PREFIX}/bin/ollama_runners/$runner/libllama.dll"
    install -D "$srcdir/$_realname/dist/windows-$dist_arch/ollama_runners/$runner/ollama_llama_server.exe" "${pkgdir}${MINGW_PREFIX}/bin/ollama_runners/$runner/ollama_llama_server.exe"
  done
}
