!IFNDEF MIX_APP_PATH
MIX_APP_PATH=$(MAKEDIR)
!ENDIF

PRIV_DIR = $(MIX_APP_PATH)/priv
EVISION_SO = $(PRIV_DIR)/evision.dll
SRC = $(MAKEDIR)\src
C_SRC = $(MAKEDIR)\c_src
PY_SRC = $(MAKEDIR)\py_src
LIB_SRC = $(MAKEDIR)\lib
PATCHES_DIR = $(MAKEDIR)\patches
!IFDEF CMAKE_TOOLCHAIN_FILE
CMAKE_CONFIGURE_FLAGS=-D CMAKE_TOOLCHAIN_FILE="$(CMAKE_TOOLCHAIN_FILE)"
!ENDIF

# OpenCV
!IFNDEF OPENCV_USE_GIT_HEAD
OPENCV_USE_GIT_HEAD=false
!ENDIF
!IFNDEF OPENCV_GIT_REPO
OPENCV_GIT_REPO="https://github.com/opencv/opencv.git"
!ENDIF
!IFNDEF OPENCV_VER
OPENCV_VER=4.6.0
!ENDIF
!IF "$(OPENCV_USE_GIT_HEAD)" == "true"
OPENCV_VER=$(OPENCV_USE_GIT_BRANCH)
!ENDIF
OPENCV_CACHE_DIR = $(MAKEDIR)\3rd_party\cache
OPENCV_SOURCE_URL = "https://github.com/opencv/opencv/archive/$(OPENCV_VER).zip"
OPENCV_SOURCE_ZIP = $(OPENCV_CACHE_DIR)\opencv-$(OPENCV_VER).zip
OPENCV_ROOT_DIR = $(MAKEDIR)\3rd_party\opencv
OPENCV_DIR = $(OPENCV_ROOT_DIR)\opencv-$(OPENCV_VER)
OPENCV_CONFIGURATION_PRIVATE_HPP = $(OPENCV_DIR)\modules\core\include\opencv2\core\utils\configuration.private.hpp
CMAKE_OPENCV_BUILD_DIR = $(MIX_APP_PATH)/cmake_opencv_$(OPENCV_VER)
!IFNDEF CMAKE_OPENCV_MODULE_SELECTION
CMAKE_OPENCV_MODULE_SELECTION = -D BUILD_opencv_python2=OFF -D BUILD_opencv_python3=OFF -D BUILD_opencv_gapi=OFF
!ENDIF
!IFNDEF CMAKE_OPENCV_IMG_CODER_SELECTION
CMAKE_OPENCV_IMG_CODER_SELECTION = -D BUILD_PNG=ON -D BUILD_JPEG=ON -D BUILD_TIFF=ON -D BUILD_WEBP=ON -D BUILD_OPENJPEG=ON -D BUILD_JASPER=ON -D BUILD_OPENEXR=ON
!ENDIF
!IFNDEF CMAKE_OPENCV_OPTIONS
CMAKE_OPENCV_OPTIONS = ""
!ENDIF
!IFNDEF CMAKE_OPTIONS
CMAKE_OPTIONS = $(CMAKE_OPENCV_MODULE_SELECTION) $(CMAKE_OPENCV_IMG_CODER_SELECTION)
!ENDIF
CMAKE_WIN_FINAL_OPTIONS = $(CMAKE_OPTIONS) $(CMAKE_CONFIGURE_FLAGS) $(CMAKE_OPENCV_OPTIONS)
!IFNDEF ENABLED_CV_MODULES
ENABLED_CV_MODULES = ""
!ENDIF

# evision
HEADERS_TXT = $(CMAKE_OPENCV_BUILD_DIR)\modules\python_bindings_generator\headers.txt
CONFIGURATION_PRIVATE_HPP = $(C_SRC)\configuration.private.hpp
GENERATED_ELIXIR_SRC_DIR = $(LIB_SRC)\generated
GENERATED_ERLANG_SRC_DIR = $(SRC)\generated
CMAKE_EVISION_BUILD_DIR = $(MIX_APP_PATH)/cmake_evision
!IFNDEF EVISION_PREFER_PRECOMPILED
EVISION_PREFER_PRECOMPILED = "false"
!ENDIF
!IFNDEF EVISION_PRECOMPILED_CACHE_DIR
EVISION_PRECOMPILED_CACHE_DIR = $(MAKEDIR)\.cache
!ENDIF
!IFNDEF EVISION_GENERATE_LANG
EVISION_GENERATE_LANG = elixir
!ENDIF

!IFNDEF CMAKE_GENERATOR_TYPE
!IFNDEF MSBUILD_PLATFORM

!IF "$(HAVE_NINJA)" == "true"
CMAKE_GENERATOR_TYPE=Ninja
!ELSE
CMAKE_GENERATOR_TYPE=NMake Makefiles
!ENDIF

!ENDIF
!ENDIF

!IFNDEF CMAKE_BUILD_TYPE
CMAKE_BUILD_TYPE=Release
!ENDIF

!IFDEF MSBUILD_PLATFORM
CMAKE_BUILD_PARAMETER= --config "$(CMAKE_BUILD_TYPE)" -- /p:Platform=$(MSBUILD_PLATFORM)
!ELSE
CMAKE_BUILD_PARAMETER= --config "$(CMAKE_BUILD_TYPE)"
!ENDIF

build: $(EVISION_SO)

$(CONFIGURATION_PRIVATE_HPP):
!IF "$(EVISION_PREFER_PRECOMPILED)" != "true"
	@ powershell scripts/download_opencv.ps1 "$(OPENCV_VER)" "$(OPENCV_CACHE_DIR)" "$(OPENCV_ROOT_DIR)"
	@ copy "$(OPENCV_CONFIGURATION_PRIVATE_HPP)" "$(CONFIGURATION_PRIVATE_HPP)"
!ENDIF

$(HEADERS_TXT): $(CONFIGURATION_PRIVATE_HPP)
!IF "$(EVISION_PREFER_PRECOMPILED)" != "true"
	@ if not exist "$(CMAKE_OPENCV_BUILD_DIR)" mkdir "$(CMAKE_OPENCV_BUILD_DIR)"
	python3 "$(PATCHES_DIR)\apply_patch.py" "$(OPENCV_DIR)" "$(OPENCV_VER)"
	cd "$(CMAKE_OPENCV_BUILD_DIR)" && \
	cmake -G "$(CMAKE_GENERATOR_TYPE)" \
	    -D CMAKE_BUILD_TYPE="$(CMAKE_BUILD_TYPE)" \
		-D CMAKE_INSTALL_PREFIX="$(PRIV_DIR)" \
		-D PYTHON3_EXECUTABLE="$(PYTHON3_EXECUTABLE)" \
		-D INSTALL_PYTHON_EXAMPLES=OFF \
		-D INSTALL_C_EXAMPLES=OFF \
		-D BUILD_EXAMPLES=OFF \
		-D BUILD_TESTS=OFF \
		-D BUILD_PERF_TESTS=OFF \
		-D OPENCV_ENABLE_NONFREE=OFF \
		-D OPENCV_GENERATE_PKGCONFIG=ON \
		-D OPENCV_PC_FILE_NAME=opencv4.pc \
		-D BUILD_ZLIB=ON \
		-D BUILD_opencv_gapi=OFF \
		-D CMAKE_C_FLAGS="/D PNG_ARM_NEON_OPT=0" \
		-D CMAKE_CXX_FLAGS="/D PNG_ARM_NEON_OPT=0" \
		-D CMAKE_TOOLCHAIN_FILE="$(TOOLCHAIN_FILE)" \
		$(CMAKE_WIN_FINAL_OPTIONS) "$(OPENCV_DIR)" && \
		cmake --build . $(CMAKE_BUILD_PARAMETER) && \
		cd "$(CMAKE_OPENCV_BUILD_DIR)" && cmake --install . --config "$(CMAKE_BUILD_TYPE)" && \
	copy "$(HEADERS_TXT)" "$(C_SRC)/headers.txt" && \
	cd "$(CMAKE_OPENCV_BUILD_DIR)\bin" && \
	powershell -command "Get-ChildItem *.dll -Recurse | Copy-Item -Destination \"$(PRIV_DIR)\""
!ENDIF

$(EVISION_SO): $(HEADERS_TXT)
	@ if not exist "$(PRIV_DIR)" mkdir "$(PRIV_DIR)"
	@ if not exist "$(CMAKE_EVISION_BUILD_DIR)" mkdir "$(CMAKE_EVISION_BUILD_DIR)"
	@ if not exist "$(GENERATED_ELIXIR_SRC_DIR)" mkdir "$(GENERATED_ELIXIR_SRC_DIR)"
	@ if not exist "$(GENERATED_ERLANG_SRC_DIR)" mkdir "$(GENERATED_ERLANG_SRC_DIR)"
	cd "$(CMAKE_EVISION_BUILD_DIR)" && \
		cmake -G "$(CMAKE_GENERATOR_TYPE)" \
		  --no-warn-unused-cli \
		  -D CMAKE_BUILD_TYPE="$(CMAKE_BUILD_TYPE)" \
		  -D C_SRC="$(C_SRC)" \
		  -D CMAKE_TOOLCHAIN_FILE="$(TOOLCHAIN_FILE)" \
		  -D GENERATED_ELIXIR_SRC_DIR="$(GENERATED_ELIXIR_SRC_DIR)" \
		  -D GENERATED_ERLANG_SRC_DIR="$(GENERATED_ERLANG_SRC_DIR)" \
		  -D PY_SRC="$(PY_SRC)" \
		  -D MIX_APP_PATH="$(MIX_APP_PATH)" \
		  -D PRIV_DIR="$(PRIV_DIR)" \
		  -D ERTS_INCLUDE_DIR="$(ERTS_INCLUDE_DIR)" \
		  -D ENABLED_CV_MODULES=$(ENABLED_CV_MODULES) \
		  -D EVISION_GENERATE_LANG="$(EVISION_GENERATE_LANG)" \
		  $(CMAKE_CONFIGURE_FLAGS) "$(MAKEDIR)" && \
		cmake --build . $(CMAKE_BUILD_PARAMETER)
!IF "$(EVISION_PREFER_PRECOMPILED)" != "true"
    @ powershell -command Copy-Item -Path (Get-ChildItem -Path "*evision.so" -Recurse).FullName -Destination "$(EVISION_SO)"
!ENDIF
