#!/bin/bash
zigbuild=zig-linux-x86_64-0.11.0-dev.514+4be1bb4aa.tar.xz
zigversion=$(echo $zigbuild | cut -d '-' -f 4)
if [ -e toolchain-zig ] ; then
        echo "ERROR: A toolchain-zig directory already exists, aborting install"
        exit 1
fi
parentdir=$(pwd)
mkdir -p toolchain-zig toolchain-zig-dl
cd toolchain-zig

# Zig install
if [ ! -e ../toolchain-zig-dl/$zigbuild ] ; then
        (cd ../toolchain-zig-dl && wget https://ziglang.org/builds/$zigbuild)
fi
xz -dc <../toolchain-zig-dl/$zigbuild | tar -xvf -
ln -s ${zigbuild/.tar.xz/} zig-$zigversion
cat > env.sh  <<'EOF'
#!/bin/bash
echo "Reminder: this script has to be used with source (.) instead of exec"
EOF
echo "export PATH=\$PATH:$parentdir/toolchain-zig/zig-$zigversion" >> env.sh
chmod 755 env.sh
# Convenience scripts
cat > compile.sh  <<EOF
#!/bin/bash
if [ "m\$2" = "m--help" ] ; then
        echo "Syntax: \$0 source.c -c -o result.o [flags]"
        exit 1
fi
. "$parentdir/toolchain-zig/env.sh" >/dev/null
exec zig cc "-I$parentdir/toolchain-zig/windows-msys2-mingw/include/" "-I$parentdir/toolchain-zig/windows-msys2-mingw/include/w32api/" "-I$parentdir/toolchain-zig/windows-msys2-mingw/include/SDL2" "-I$parentdir/toolchain-zig/windows-msys2-mingw/include/SDL" "-I$parentdir/toolchain-zig/sdl3-windows/SDL3/include" "-I$parentdir/toolchain-zig/sdl3-windows/SDL_ttf/include" "\$@" -target x86_64-windows-gnu
EOF
chmod 755 compile.sh
cat > compile-cpp.sh  <<EOF
#!/bin/bash
if [ "m$2" = "m--help" ] ; then
        echo "Syntax: $0 source.cpp -c -o result.o [flags]"
        exit 1
fi
. "$parentdir/toolchain-zig/env.sh" >/dev/null
exec zig c++ "-I$parentdir/toolchain-zig/windows-msys2-mingw/include/" "-I$parentdir/toolchain-zig/windows-msys2-mingw/include/w32api/" "-I$parentdir/toolchain-zig/windows-msys2-mingw/include/SDL2" "-I$parentdir/toolchain-zig/windows-msys2-mingw/include/SDL" "-I$parentdir/toolchain-zig/sdl3-windows/SDL3/include" "-I$parentdir/toolchain-zig/sdl3-windows/SDL_ttf/include" "\$@" -target x86_64-windows-gnu
EOF
chmod 755 compile-cpp.sh

cat > link.sh  <<EOF
#!/bin/bash
tmpicon=0
if [ "m\$1" = "m-icon" ] ; then
        shift
        icon="\$1"
        shift
else
        tmpicon=1
        icon=\$(mktemp -p . --suffix=.png)
        convert -size 256x256 xc:white \$icon
fi
if [ "\${icon/.png/}" = "\$icon" ] || [ "\${1/.exe/}" = "\$1" ] || [ ! -e "\$2" ] ; then
        echo "Syntax: \$0 [-icon myicon.png] result.exe source1.o [source2.o [...]"
        if [ \$tmpicon -eq 1 ] ; then rm "\$icon" ; fi
        exit 1
fi
. "$parentdir/toolchain-zig/env.sh" >/dev/null
name="\${1/.exe/}"
shift
convert "\$icon" "\${icon/.png/-buildiconobject.ico}" && \
 echo "1 ICON \"\${icon/.png/-buildiconobject.ico}\"" > "\${icon/.png/-buildiconobject.rc}" && \
 x86_64-w64-mingw32-windres --preprocessor /usr/bin/cpp "\${icon/.png/-buildiconobject.rc}" "\${icon/.png/-buildiconobject.o}" && \
 zig build-exe --subsystem windows "\$@" \${icon/.png/-buildiconobject.o} -L$parentdir/toolchain-zig/windows-msys2-mingw/lib/ -L$parentdir/toolchain-zig/windows-msys2-mingw/lib/w32api $parentdir/toolchain-zig/sdl3-windows/libSDL3.dll.a $parentdir/toolchain-zig/sdl3-windows/libSDL3_ttf.dll.a $parentdir/toolchain-zig/sdl3-windows/libfreetype.a -lgdi32 -lwinmm -lsetupapi -lmincore -lwindowsapp -limm32 -lversion -lgraphite2 -lpng -lbrotlidec -lbrotlicommon -lharfbuzz -lstdc++ -lbz2 -lz --name \$name -target x86_64-windows-gnu && rm \${name}.lib \${name}.pdb
res=\$?
rm "\${icon/.png/-buildiconobject.ico}" "\${icon/.png/-buildiconobject.rc}" "\${icon/.png/-buildiconobject.o}"
if [ \$tmpicon -eq 1 ] ; then rm "\$icon" ; fi
exit \$res
EOF
chmod 755 link.sh
# msys2 install
mkdir -p windows-msys2-mingw
cat > deps.txt <<'EOF'
https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-aom-3.5.0-1-any.pkg.tar.zst
https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-brotli-1.0.9-5-any.pkg.tar.zst
https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-bzip2-1.0.8-2-any.pkg.tar.zst
https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-ca-certificates-20211016-3-any.pkg.tar.zst
https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-dav1d-1.0.0-1-any.pkg.tar.zst
https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-expat-2.5.0-1-any.pkg.tar.zst
https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-flac-1.4.2-1-any.pkg.tar.zst
https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-fluidsynth-2.3.0-1-any.pkg.tar.zst
https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-freetype-2.12.1-1-any.pkg.tar.zst
https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-gcc-libs-12.2.0-6-any.pkg.tar.zst
https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-gettext-0.21-3-any.pkg.tar.zst
https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-giflib-5.2.1-3-any.pkg.tar.zst
https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-glib2-2.74.3-1-any.pkg.tar.zst
https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-gmp-6.2.1-3-any.pkg.tar.zst
https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-graphite2-1.3.14-2-any.pkg.tar.zst
https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-harfbuzz-5.3.1-2-any.pkg.tar.zst
https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-highway-1.0.2-1-any.pkg.tar.zst
https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-imath-3.1.6-1-any.pkg.tar.zst
https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-jbigkit-2.1-4-any.pkg.tar.xz
https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-lcms2-2.14-1-any.pkg.tar.zst
https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-lerc-4.0.0-1-any.pkg.tar.zst
https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-libavif-0.11.1-3-any.pkg.tar.zst
https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-libdeflate-1.15-1-any.pkg.tar.zst
https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-libffi-3.4.4-1-any.pkg.tar.zst
https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-libiconv-1.17-1-any.pkg.tar.zst
https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-libjpeg-turbo-2.1.4-1-any.pkg.tar.zst
https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-libjxl-0.7.0-2-any.pkg.tar.zst
https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-libmodplug-0.8.9.0-4-any.pkg.tar.zst
https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-libogg-1.3.5-1-any.pkg.tar.zst
https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-libpng-1.6.39-1-any.pkg.tar.zst
https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-libsndfile-1.1.0-3-any.pkg.tar.zst
https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-libsystre-1.0.1-4-any.pkg.tar.xz
https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-libtasn1-4.19.0-1-any.pkg.tar.zst
https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-libtiff-4.4.0-6-any.pkg.tar.zst
https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-libtre-git-r128.6fb7206-2-any.pkg.tar.xz
https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-libvorbis-1.3.7-1-any.pkg.tar.zst
https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-libwebp-1.2.4-2-any.pkg.tar.zst
https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-libwinpthread-git-10.0.0.r157.gd295924f0-1-any.pkg.tar.zst
https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-libyuv-1844.r2374.f9fda6e7-1-any.pkg.tar.zst
https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-mpc-1.2.1-1-any.pkg.tar.zst
https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-mpdecimal-2.5.1-1-any.pkg.tar.zst
https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-mpfr-4.1.0.p13-1-any.pkg.tar.zst
https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-mpg123-1.31.1-1-any.pkg.tar.zst
https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-ncurses-6.3-6-any.pkg.tar.zst
https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-openexr-3.1.5-2-any.pkg.tar.zst
https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-openssl-1.1.1.s-1-any.pkg.tar.zst
https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-opus-1.3.1-5-any.pkg.tar.zst
https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-opusfile-0.12-2-any.pkg.tar.zst
https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-p11-kit-0.24.1-3-any.pkg.tar.zst
https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-pcre2-10.40-1-any.pkg.tar.zst
https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-portaudio-1~19.7.0-4-any.pkg.tar.zst
https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-python-3.10.8-2-any.pkg.tar.zst
https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-rav1e-0.6.1-1-any.pkg.tar.zst
https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-SDL2-2.26.0-1-any.pkg.tar.zst
https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-SDL2_image-2.6.2-3-any.pkg.tar.zst
https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-SDL2_mixer-2.6.2-1-any.pkg.tar.zst
https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-SDL2_ttf-2.20.1-1-any.pkg.tar.zst
https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-sqlite3-3.40.0-1-any.pkg.tar.zst
https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-svt-av1-1.3.0-1-any.pkg.tar.zst
https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-tcl-8.6.12-1-any.pkg.tar.zst
https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-tzdata-2022g-1-any.pkg.tar.zst
https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-vulkan-headers-1.3.236-1-any.pkg.tar.zst
https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-vulkan-loader-1.3.236-1-any.pkg.tar.zst
https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-wineditline-2.205-3-any.pkg.tar.xz
https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-xz-5.2.9-1-any.pkg.tar.zst
https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-zlib-1.2.13-2-any.pkg.tar.zst
https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-zstd-1.5.2-2-any.pkg.tar.zst
https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-winpthreads-git-12.0.0.r351.gcdf6b16b8-1-any.pkg.tar.zst
https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-cmake-3.30.5-1-any.pkg.tar.zst
https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-ninja-1.12.1-1-any.pkg.tar.zst
https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-pkg-config-0.29.2-6-any.pkg.tar.zst
https://mirror.msys2.org/msys/x86_64/msys2-w32api-headers-10.0.0.r16.g49a56d453-1-x86_64.pkg.tar.zst
https://mirror.msys2.org/msys/x86_64/msys2-w32api-runtime-10.0.0.r16.g49a56d453-1-x86_64.pkg.tar.zst
https://mirror.msys2.org/msys/x86_64/perl-5.38.2-2-x86_64.pkg.tar.zst
EOF
for i in  $(cat deps.txt) ; do
        if [ ! -e ../toolchain-zig-dl/$(basename $i) ] ; then
                (cd ../toolchain-zig-dl && wget $i )
        fi
done
for i in $(cd ../toolchain-zig-dl && find . -maxdepth 1 -name "*.zst") ; do 
         ( mkdir -p t ; cd t ; cat ../../toolchain-zig-dl/$i | zstd -dc | tar -xvf - ; find . -maxdepth 1 -type d  -print | grep -v "^\.\$" | while read l ; do
          (cd $l && tar -cf - . | (cd $parentdir/toolchain-zig/windows-msys2-mingw && tar -xvf - ) ) ; done ) ; rm -rf t ; done
for i in $(cd ../toolchain-zig-dl && find . -maxdepth 1 -name "*.xz") ; do 
         ( mkdir -p t ; cd t ; cat ../../toolchain-zig-dl/$i | xz -dc | tar -xvf - ; find . -maxdepth 1 -type d  -print | grep -v "^\.\$" | while read l ; do
         (cd $l && tar -cf - . | (cd $parentdir/toolchain-zig/windows-msys2-mingw && tar -xvf - ) ) ; done ) ; rm -rf t ; done
cat > add-zst.sh <<'EOF'
#!/bin/bash
if [ "m$1" == "m" ] || [ "m$1" == "m--help" ] || [ ! -f "$1" ] ; then
        echo "Syntax: $0 filename.pkg.tar.zst"
        exit 0
fi
i="$1"
( mkdir -p t ; cd t ; cat ../$i | zstd -dc | tar -xvf - ; find . -maxdepth 1 -type d  -print | grep -v "^\.\$" | while read l ; do
EOF
echo " (cd \$l && tar -cf - . | (cd $parentdir/toolchain-zig/windows-msys2-mingw && tar -xvf - ) ) ; done ) ; rm -rf t " >> add-zst.sh
cat > add-xz.sh <<'EOF'
#!/bin/bash
if [ "m$1" == "m" ] || [ "m$1" == "m--help" ] || [ ! -f "$1" ] ; then
        echo "Syntax: $0 filename.pkg.tar.xz"
        exit 0
fi
i="$1"
( mkdir -p t ; cd t ; cat ../$i | xz -dc | tar -xvf - ; find . -maxdepth 1 -type d  -print | grep -v "^\.\$" | while read l ; do
EOF
echo " (cd $l && tar -cf - . | (cd $parentdir/toolchain-zig/windows-msys2-mingw && tar -xvf - ) ) ; done ) ; rm -rf t " >> add-xz.sh
chmod a+x add-xz.sh add-zst.sh
cd ..
# Check for windres
if ! which x86_64-w64-mingw32-windres >/dev/null 2>/dev/null; then
        echo "Please, install windres manually using your distribution, i.e.:" >> tooldchain-zig/error.log
        echo "sudo apt-get install binutils-mingw-w64-x86-64" >> tooldchain-zig/error.log
fi
if ! which convert >/dev/null 2>/dev/null; then
        echo "Please, install imagemagick manually using your distribution, i.e.:" >> tooldchain-zig/error.log
        echo "sudo apt-get install imagemagick" >> tooldchain-zig/error.log
fi
# SDL3 for mingw
mkdir -p "$parentdir/toolchain-zig/sdl3-windows"
cd "$parentdir/toolchain-zig/sdl3-windows"
cat > setup.sh <<'SeTuPeOf'
#!/bin/bash
#SDL3
if [ ! -e ../../toolchain-zig-dl/SDL3-preview-3.1.6.tgz ] ; then
	wget https://github.com/libsdl-org/SDL/archive/refs/tags/preview-3.1.6.tar.gz -O ../../toolchain-zig-dl/SDL3-preview-3.1.6.tgz
fi
tar -xvzf ../../toolchain-zig-dl/SDL3-preview-3.1.6.tgz
mv SDL3-3.1.6 SDL3
cd SDL3
ln -s PARENTDIR/toolchain-zig/compile.sh x86_64-w64-mingw32-gcc
ln -s PARENTDIR/toolchain-zig/compile-cpp.sh x86_64-w64-mingw32-g++
cat >> src/winresrc.h <<'EOF'
#define LANG_ENGLISH    0x09
#define SUBLANG_ENGLISH_US      0x01
EOF
PATH=$(pwd):$PATH cmake -S . -B build -DBUILD_SHARED_LIBS=ON -DCMAKE_TOOLCHAIN_FILE=build-scripts/cmake-toolchain-mingw64-x86_64.cmake -DCMAKE_MAKE_PROGRAM=make -DCMAKE_C_COMPILER=x86_64-w64-mingw32-gcc -DCMAKE_CXX_COMPILER=x86_64-w64-mingw32-g++ && cmake --build build
cd ..
cp ./SDL3/build/SDL3.dll .
cp ./SDL3/build/libSDL3.dll.a .
#SDL3_ttf
if [ -e ../../toolchain-zig-dl/SDL_ttf.tgz ] ; then
	tar -xf ../../toolchain-zig-dl/SDL_ttf.tgz
else
	git clone --recurse-submodules -j4 https://github.com/libsdl-org/SDL_ttf.git
	tar -cf ../../toolchain-zig-dl/SDL_ttf.tgz SDL_ttf
fi
cd SDL_ttf
sed -i "s/SDL_REQUIRED_VERSION 3\.1\.5/SDL_REQUIRED_VERSION 3.1.6/g" CMakeLists.txt
ln -s PARENTDIR/toolchain-zig/compile.sh x86_64-w64-mingw32-gcc
ln -s PARENTDIR/toolchain-zig/compile-cpp.sh x86_64-w64-mingw32-g++
mkdir -p build/external/freetype/include
cat >> build/external/freetype/include/windows.h <<'EOF'
#define	VS_FF_DEBUG	0x01L
#define	VFT_DLL	0x00000002L
#define	VFT_STATIC_LIB	0x00000007L
#define	VS_FF_DEBUG	0x01L
#define	VS_FFI_FILEFLAGSMASK	0x0000003fL
EOF
cat >> build/external/freetype/include/winresrc.h <<'EOF'
#define LANG_ENGLISH    0x09
#define SUBLANG_ENGLISH_US      0x01
EOF
cat >> freetype_Use_SDL_StepBackUTF8.patch <<'EOF'
diff --git a/examples/editbox.c b/examples/editbox.c
index f96d5087..b2028178 100644
--- a/examples/editbox.c
+++ b/examples/editbox.c
@@ -633,19 +633,14 @@ void EditBox_Backspace(EditBox *edit)
         return;
     }
 
-    const char *start = &edit->text->text[edit->cursor];
-    const char *current = start;
-    /* Step back over the previous UTF-8 character */
-    do {
-        if (current == edit->text->text) {
-            break;
-        }
-        --current;
-    } while ((*current & 0xC0) == 0x80);
-
-    int length = (int)(start - current);
-    TTF_DeleteTextString(edit->text, edit->cursor - length, length);
-    edit->cursor -= length;
+    if (edit->cursor > 0) {
+        const char *start = &edit->text->text[edit->cursor];
+        const char *next = start;
+        SDL_StepBackUTF8(edit->text->text, &next);
+        int length = (int)(uintptr_t)(start - next);
+        TTF_DeleteTextString(edit->text, edit->cursor - length, length);
+        edit->cursor -= length;
+    }
 }
EOF
# revert patch https://discourse.libsdl.org/t/sdl-ttf-use-sdl-stepbackutf8/54854
#( patch -R -p1 < ./freetype_Use_SDL_StepBackUTF8.patch )
sed -i "s/vendored_default FALSE/vendored_default TRUE/g" CMakeLists.txt
PATH=$(pwd):$PATH cmake -S . -B build -DBUILD_SHARED_LIBS=ON -DCMAKE_TOOLCHAIN_FILE=build-scripts/cmake-toolchain-mingw64-x86_64.cmake -DCMAKE_MAKE_PROGRAM=make -DCMAKE_C_COMPILER=x86_64-w64-mingw32-gcc -DCMAKE_CXX_COMPILER=x86_64-w64-mingw32-g++ -DSDL3_DIR=PARENTDIR/toolchain-zig/sdl3-windows/SDL3/build && cmake --build build
cd ..
cp SDL_ttf/build/SDL3_ttf.dll .
cp SDL_ttf/build/libSDL3_ttf.dll.a .
cp SDL_ttf/build/external/freetype/libfreetype.a .
SeTuPeOf
sed -i "s#PARENTDIR#$parentdir#g" setup.sh
chmod a+x setup.sh
./setup.sh
cd ..
# Show errors if tehre is an error.log file
if [ -e toolchain-zig/error.log ] ; then
	cat toolchain-zig/error.log
fi
# Success message
echo ""
echo "Installation complete."
echo "To use the zig toolchain, first include env.sh with \". toolchain-zig/env.sh\""
echo "( alternative: use toolchain-zig/compile.sh and toolchain-zig/link.sh )"