#!/bin/zsh
# Dong goi Open CASCADE (OCCT 7.9.3) thanh MOT dynamic framework (OCCT.framework) cho iOS — phuong an LGPL "B".
# KHONG bien dich lai OCCT: noi lai (relink) chinh cac thu vien tinh da dung tu ma nguon goc V7_9_3 chua sua:
#     libOCCT.a   <- Scripts/build-occt-ios.sh   sim|device
#     libOCCTDE.a <- Scripts/build-occt-de-ios.sh sim|device
# thanh MOT dylib (-all_load: giu NGUYEN moi doi tuong, khong cat bot ham -> nguoi nhan co the thay the framework bang ban OCCT da sua,
# mien giu ten OCCT.framework/OCCT va cac ky hieu tuong thich — dieu kien LGPL 2.1 muc 6).
#
#   Scripts/build-occt-framework.sh sim       # ThirdParty/occt-fw/sim/OCCT.framework
#   Scripts/build-occt-framework.sh device    # ThirdParty/occt-fw/device/OCCT.framework
#   Scripts/build-occt-framework.sh xcf       # gop thanh ThirdParty/OCCT.xcframework (app nhung + ky qua project.yml)
#   Scripts/build-occt-framework.sh verify    # kiem cau truc + chu ky + ky hieu cua xcframework
#
# Framework phang (flat bundle) kieu iOS: OCCT.framework/{OCCT, Info.plist, PrivacyInfo.xcprivacy, LICENSE_LGPL_21.txt, OCCT_LGPL_EXCEPTION.txt}.
# Khong dong header (app van lay header tu ThirdParty/occt-ios/<sim|device>/inc qua HEADER_SEARCH_PATHS).
set -euo pipefail
GOC=${0:A:h:h}
SRC=$GOC/ThirdParty/occt-src
LIB=$GOC/ThirdParty/occt-ios
OUT=$GOC/ThirdParty/occt-fw
IOS_MIN=17.0
OCCT_VER=7.9.3
FW_ID=net.vntalk.jfudesign.occt

lam_mot() {
  local ten=$1 sdk=$2 triple=$3 plat=$4
  local sysroot; sysroot=$(xcrun --sdk "$sdk" --show-sdk-path)
  local fw=$OUT/$ten/OCCT.framework
  [[ -f $LIB/$ten/libOCCT.a && -f $LIB/$ten/libOCCTDE.a ]] || { echo "thieu libOCCT.a / libOCCTDE.a o $LIB/$ten — chay build-occt-ios.sh va build-occt-de-ios.sh truoc"; exit 1; }
  rm -rf "$fw"; mkdir -p "$fw"
  # libOCCT.a gop ca TKMesh va TKXMesh (plugin cho Draw): XBRepMesh.cxx.o va BRepMesh_IncrementalMesh.cxx.o cung dinh nghia _DISCRETALGO.
  # Lien ket tinh khong keo XBRepMesh (khong ai goi) nen khong sao; dylib -all_load thi bao "duplicate symbol" -> bo doi tuong plugin
  # khoi BAN SAO tam (khong dung vao libOCCT.a goc). Plugin DISCRETFACTORY chi dung cho Draw, app khong dung.
  local tmp=$OUT/$ten/.tmp; rm -rf "$tmp"; mkdir -p "$tmp"
  cp "$LIB/$ten/libOCCT.a" "$LIB/$ten/libOCCTDE.a" "$tmp/"
  for m in XBRepMesh.cxx.o; do xcrun ar d "$tmp/libOCCT.a" "$m"; done
  xcrun ranlib "$tmp/libOCCT.a"
  xcrun clang++ -dynamiclib -arch arm64 -target "$triple" -isysroot "$sysroot" \
    -Wl,-all_load "$tmp/libOCCT.a" "$tmp/libOCCTDE.a" \
    -install_name @rpath/OCCT.framework/OCCT \
    -compatibility_version 7.9.0 -current_version $OCCT_VER \
    -framework Foundation -framework UIKit -o "$fw/OCCT"
  rm -rf "$tmp"
  cat > "$fw/Info.plist" <<PLIST
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>CFBundleDevelopmentRegion</key><string>en</string>
	<key>CFBundleExecutable</key><string>OCCT</string>
	<key>CFBundleIdentifier</key><string>$FW_ID</string>
	<key>CFBundleInfoDictionaryVersion</key><string>6.0</string>
	<key>CFBundleName</key><string>OCCT</string>
	<key>CFBundlePackageType</key><string>FMWK</string>
	<key>CFBundleShortVersionString</key><string>$OCCT_VER</string>
	<key>CFBundleVersion</key><string>1</string>
	<key>CFBundleSupportedPlatforms</key><array><string>$plat</string></array>
	<key>MinimumOSVersion</key><string>$IOS_MIN</string>
	<key>UIDeviceFamily</key><array><integer>2</integer></array>
</dict>
</plist>
PLIST
  cp "$GOC/Scripts/occt-framework/PrivacyInfo.xcprivacy" "$fw/PrivacyInfo.xcprivacy"
  cp "$SRC/LICENSE_LGPL_21.txt" "$SRC/OCCT_LGPL_EXCEPTION.txt" "$fw/"
  echo "XONG $ten -> $fw ($(du -sh "$fw/OCCT" | cut -f1))"
}

case ${1:-} in
  sim) lam_mot sim iphonesimulator arm64-apple-ios$IOS_MIN-simulator iPhoneSimulator ;;
  device) lam_mot device iphoneos arm64-apple-ios$IOS_MIN iPhoneOS ;;
  xcf)
    rm -rf "$GOC/ThirdParty/OCCT.xcframework"
    args=()
    for t in device sim; do [[ -d $OUT/$t/OCCT.framework ]] && args+=(-framework "$OUT/$t/OCCT.framework"); done
    xcodebuild -create-xcframework "${args[@]}" -output "$GOC/ThirdParty/OCCT.xcframework"
    ;;
  verify)
    for d in "$GOC"/ThirdParty/OCCT.xcframework/*/OCCT.framework; do
      echo "== $d"; ls "$d"; file "$d/OCCT" | sed 's/^.*: //'; otool -D "$d/OCCT" | tail -1
      otool -L "$d/OCCT" | tail -n +2 | awk '{print "  dep:",$1}'
      plutil -lint "$d/Info.plist"
    done ;;
  *) echo "dung: $0 sim|device|xcf|verify"; exit 1 ;;
esac
