#!/bin/bash
# 產生 .deb 與 .tar.gz 安裝包。用法：packaging/build-packages.sh
# 輸出在 dist/ 底下。需要：cargo、已下載的 CEF（預設 ~/.local/share/cef）、
# dpkg-deb、strip、ImageMagick（convert，轉圖示）。
set -euo pipefail

cd "$(dirname "$0")/.."
ROOT="$PWD"
CEF_PATH="${CEF_PATH:-$HOME/.local/share/cef}"
NAME=vpn-cef-browser
VERSION=$(grep -m1 '^version' Cargo.toml | sed 's/.*"\(.*\)".*/\1/')
ARCH=amd64
DIST="$ROOT/dist"
STAGE="$DIST/stage"
APP="$STAGE/app"          # 應用程式本體（deb 裝到 /opt/$NAME、tar.gz 放在 $NAME/）
LOCALES="zh-TW zh-CN en-US en-GB"   # 只帶這幾個語系，省約 45MB；其他語系 CEF 會退回 en-US

# 內建字型（全字庫正楷體，標楷體的替代）不在 git 裡，缺的話先下載
[ -f resources/fonts/TW-Kai-98_1.ttf ] || packaging/fetch-fonts.sh

# Google 雲端硬碟同步（src/shared/gdrive_sync.rs）用的 OAuth 用戶端 ID / 密鑰：公司在 Google Cloud 建一組（類型「電腦版應用程式」），
# 放在 packaging/google-oauth.local（第 1 行用戶端 ID、第 2 行用戶端密鑰；這台電腦專用，不進 git），或用環境變數
# VPN_GOOGLE_CLIENT_ID / VPN_GOOGLE_CLIENT_SECRET。編譯時會編進程式；沒有的話設定頁會說還沒設定（使用者可以在「進階」自己填）。
if [ -z "${VPN_GOOGLE_CLIENT_ID:-}" ] && [ -f "$ROOT/packaging/google-oauth.local" ]; then
  VPN_GOOGLE_CLIENT_ID="$(sed -n 1p "$ROOT/packaging/google-oauth.local" | tr -d '[:space:]')"
  VPN_GOOGLE_CLIENT_SECRET="$(sed -n 2p "$ROOT/packaging/google-oauth.local" | tr -d '[:space:]')"
fi
if [ -n "${VPN_GOOGLE_CLIENT_ID:-}" ]; then
  export VPN_GOOGLE_CLIENT_ID VPN_GOOGLE_CLIENT_SECRET="${VPN_GOOGLE_CLIENT_SECRET:-}"
  echo "（Google 雲端硬碟同步：已內建用戶端 ID）"
else
  echo "（Google 雲端硬碟同步：沒有內建用戶端 ID，使用者要在設定頁「進階」自己填）"
fi

echo "== 1/5 release 編譯 =="
CEF_PATH="$CEF_PATH" cargo build --release

echo "== 2/5 整理檔案（strip libcef.so，約 1.4GB → 數百 MB） =="
rm -rf "$DIST"
mkdir -p "$APP/locales"
install -m 0755 "target/release/$NAME" "$APP/$NAME"
for f in libcef.so libvk_swiftshader.so libvulkan.so.1; do
  cp "$CEF_PATH/$f" "$APP/$f"
  strip --strip-unneeded "$APP/$f" 2>/dev/null || true
done
for f in icudtl.dat v8_context_snapshot.bin resources.pak chrome_100_percent.pak chrome_200_percent.pak vk_swiftshader_icd.json; do
  cp "$CEF_PATH/$f" "$APP/$f"
done
for l in $LOCALES; do cp "$CEF_PATH/locales/$l.pak" "$APP/locales/"; done
strip --strip-unneeded "$APP/$NAME" 2>/dev/null || true
cp "$CEF_PATH/CREDITS.html" "$APP/CREDITS.html" 2>/dev/null || true
# 內建字型（docs.rs 的 kai_font 從執行檔旁的 fonts/ 讀）
mkdir -p "$APP/fonts"
cp resources/fonts/TW-Kai-98_1.ttf resources/fonts/LICENSE-TW-Kai.txt "$APP/fonts/"

# 圖示：M 的圖示（跟 macOS 的 AppIcon 同一張設計稿）轉成桌面環境要的各種尺寸
ICONS="$DIST/icons"
ICON_SIZES="16 24 32 48 64 128 256 512"
for s in $ICON_SIZES; do
  mkdir -p "$ICONS/${s}x${s}/apps"
  convert packaging/icon/AppIcon-1024.png -filter Lanczos -resize "${s}x${s}" -strip "$ICONS/${s}x${s}/apps/$NAME.png"
done

# 啟動腳本：用自己所在位置找到 libcef.so，不管裝在哪都能跑
cat > "$APP/$NAME.sh" <<'LAUNCH'
#!/bin/sh
HERE=$(dirname "$(readlink -f "$0")")
export LD_LIBRARY_PATH="$HERE${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
exec "$HERE/vpn-cef-browser" "$@"
LAUNCH
chmod 0755 "$APP/$NAME.sh"

# 終端機指令「m」：在背景開 M、馬上回到命令列（關掉終端機也不會跟著關），訊息寫到
# ~/.cache/vpn-cef-browser/m.log。可以帶網址或檔案（m https://… / m 報告.docx）。
# 沒有圖形畫面（純文字畫面 Ctrl+Alt+F3、SSH）開不了視窗，直接用中文說明。
cat > "$APP/m" <<'MCMD'
#!/bin/sh
HERE=$(dirname "$(readlink -f "$0")")
if [ -z "$DISPLAY" ] && [ -z "$WAYLAND_DISPLAY" ]; then
  echo "M 是視窗程式，要在桌面（圖形介面）裡開的終端機執行。這裡沒有圖形畫面（DISPLAY 沒有設定），開不了視窗。" >&2
  exit 1
fi
LOG=/dev/null
DIR="${XDG_CACHE_HOME:-$HOME/.cache}/vpn-cef-browser"
mkdir -p "$DIR" 2>/dev/null && LOG="$DIR/m.log"
setsid -f "$HERE/vpn-cef-browser.sh" "$@" >"$LOG" 2>&1 </dev/null
MCMD
chmod 0755 "$APP/m"

# 名稱只寫「M」（產品名稱，跟 macOS 一樣）；Name[zh_TW] 也要寫，不然中文桌面會沿用舊的翻譯。
# StartupWMClass 要跟程式設的 WM_CLASS 一樣（src/linux/mod.rs 的 APP_ID），工作列才對得到。
desktop_entry() {  # $1 = Exec 路徑, $2 = Icon 路徑或名稱
cat <<DESK
[Desktop Entry]
Type=Application
Name=M
Name[zh_TW]=M
GenericName=Web Browser
GenericName[zh_TW]=智新工作瀏覽器
Comment=Chromium 核心瀏覽器，內建文件、試算表、簡報
Exec=$1 %U
Icon=$2
Terminal=false
Categories=Network;WebBrowser;
StartupWMClass=vpn-cef-browser
DESK
}

echo "== 3/5 .deb =="
DEB="$DIST/deb"
mkdir -p "$DEB/DEBIAN" "$DEB/opt/$NAME" "$DEB/usr/bin" "$DEB/usr/share/applications" "$DEB/usr/share/icons"
cp -a "$APP/." "$DEB/opt/$NAME/"
ln -s "/opt/$NAME/$NAME.sh" "$DEB/usr/bin/$NAME"
ln -s "/opt/$NAME/m" "$DEB/usr/bin/m"
desktop_entry "/usr/bin/$NAME" "$NAME" > "$DEB/usr/share/applications/$NAME.desktop"
cp -r "$ICONS" "$DEB/usr/share/icons/hicolor"
INSTALLED_KB=$(du -sk "$DEB/opt" | cut -f1)
cat > "$DEB/DEBIAN/control" <<CTRL
Package: $NAME
Version: $VERSION
Section: web
Priority: optional
Architecture: $ARCH
Installed-Size: $INSTALLED_KB
Maintainer: pake <pake@steps.com.tw>
Depends: curl, zenity | kdialog, libasound2t64 | libasound2, libatk1.0-0t64 | libatk1.0-0, libatk-bridge2.0-0t64 | libatk-bridge2.0-0, libatspi2.0-0t64 | libatspi2.0-0, libcairo2, libcups2t64 | libcups2, libdbus-1-3, libdrm2, libexpat1, libfontconfig1, libgbm1, libglib2.0-0t64 | libglib2.0-0, libnspr4, libnss3, libpango-1.0-0, libx11-6, libxcb1, libxcomposite1, libxdamage1, libxext6, libxfixes3, libxi6, libxkbcommon0, libxrandr2
Recommends: fonts-noto-cjk
Suggests: ffmpeg
Description: M 智新工作瀏覽器（Chromium 核心）
 以 CEF（Chromium Embedded Framework）打造的瀏覽器：多分頁、SSL 連線與
 憑證檢視，以及內建本機文件、試算表、簡報（支援 .xlsx / .pptx 匯出）。
 文件資料只存在使用者自己的電腦上。
CTRL
# 升級/移除前先關掉還在跑的舊程式，避免新開的視窗被舊的 process 接手（看起來像沒更新）
cat > "$DEB/DEBIAN/preinst" <<'PRE'
#!/bin/sh
# 不能用 pkill -x：dpkg 跑的腳本叫 vpn-cef-browser.prerm，行程名稱截成 15 字元會等於程式名，連自己一起殺掉
pkill -f '^/opt/vpn-cef-browser/' 2>/dev/null || true
exit 0
PRE
chmod 0755 "$DEB/DEBIAN/preinst"
cp "$DEB/DEBIAN/preinst" "$DEB/DEBIAN/prerm"

cat > "$DEB/DEBIAN/postinst" <<'POST'
#!/bin/sh
set -e
command -v update-desktop-database >/dev/null 2>&1 && update-desktop-database -q /usr/share/applications || true
command -v gtk-update-icon-cache >/dev/null 2>&1 && gtk-update-icon-cache -q -t /usr/share/icons/hicolor || true
exit 0
POST
chmod 0755 "$DEB/DEBIAN/postinst"
find "$DEB" -type d -exec chmod 0755 {} +
fakeroot dpkg-deb -Zxz -z6 --build "$DEB" "$DIST/${NAME}_${VERSION}_${ARCH}.deb" >/dev/null

echo "== 4/5 .tar.gz =="
TAR="$DIST/tar/$NAME-$VERSION-linux-x86_64"
mkdir -p "$TAR"
cp -a "$APP/." "$TAR/"
cp -r "$ICONS" "$TAR/icons"
cat > "$TAR/install.sh" <<'INST'
#!/bin/sh
# 安裝：./install.sh              → 裝到 ~/.local（免 root，只有目前使用者）
#       sudo ./install.sh --system → 裝到 /opt（所有使用者）
# 解除安裝：./install.sh --uninstall [--system]
set -e
HERE=$(dirname "$(readlink -f "$0")")
NAME=vpn-cef-browser
MODE=user; ACTION=install
for a in "$@"; do case "$a" in --system) MODE=system;; --uninstall) ACTION=uninstall;; esac; done
if [ "$MODE" = system ]; then
  OPT=/opt/$NAME; BIN=/usr/local/bin; APPS=/usr/local/share/applications; ICONS=/usr/local/share/icons/hicolor
else
  OPT=$HOME/.local/opt/$NAME; BIN=$HOME/.local/bin; APPS=$HOME/.local/share/applications; ICONS=$HOME/.local/share/icons/hicolor
fi
if [ "$ACTION" = uninstall ]; then
  rm -rf "$OPT" "$BIN/$NAME" "$BIN/m" "$APPS/$NAME.desktop" "$ICONS"/*/apps/"$NAME.png"
  echo "已解除安裝（你的文件資料在 ~/.local/share/vpn-cef-browser，沒有動）"; exit 0
fi
mkdir -p "$OPT" "$BIN" "$APPS" "$ICONS"
cp -a "$HERE/." "$OPT/"
rm -rf "$OPT/install.sh" "$OPT/icons"
ln -sf "$OPT/$NAME.sh" "$BIN/$NAME"
ln -sf "$OPT/m" "$BIN/m"
cp -r "$HERE/icons/." "$ICONS/"
cat > "$APPS/$NAME.desktop" <<DESK
[Desktop Entry]
Type=Application
Name=M
Name[zh_TW]=M
GenericName=Web Browser
GenericName[zh_TW]=智新工作瀏覽器
Comment=Chromium 核心瀏覽器，內建文件、試算表、簡報
Exec=$BIN/$NAME %U
Icon=$NAME
Terminal=false
Categories=Network;WebBrowser;
StartupWMClass=vpn-cef-browser
DESK
command -v update-desktop-database >/dev/null 2>&1 && update-desktop-database -q "$APPS" || true
command -v gtk-update-icon-cache >/dev/null 2>&1 && gtk-update-icon-cache -q -t "$ICONS" || true
echo "已安裝到 $OPT，指令：m（或 $NAME；$BIN 要在 PATH 裡）。"
echo "系統需要有 Chromium 依賴的函式庫，缺的話請看安裝包裡的 README.txt。"
INST
chmod 0755 "$TAR/install.sh"
cat > "$TAR/README.txt" <<'RT'
M 智新工作瀏覽器（vpn-cef-browser）

直接執行（免安裝）：  ./m
安裝到自己的帳號：    ./install.sh
安裝給所有使用者：    sudo ./install.sh --system
解除安裝：            ./install.sh --uninstall   （系統版加 --system）

系統需求：x86_64 Linux（glibc 2.31+）、X11 或 Wayland（含 Xwayland）桌面。
Debian/Ubuntu 需要的函式庫：
  sudo apt install curl zenity libnss3 libnspr4 libatk1.0-0 libatk-bridge2.0-0 libatspi2.0-0 \
    libcups2 libdrm2 libgbm1 libxkbcommon0 libxcomposite1 libxdamage1 libxfixes3 \
    libxrandr2 libxi6 libpango-1.0-0 libcairo2 libasound2 libfontconfig1 fonts-noto-cjk
使用者資料：~/.local/share/vpn-cef-browser/
檔案對話框（上傳檔案、開啟檔案、另存新檔、選資料夾）用 zenity（KDE 用 kdialog）。
影片清單的縮圖要有 ffmpeg（沒有也能用，只是不顯示縮圖）。
RT
( cd "$DIST/tar" && tar -I 'gzip -9' -cf "../$NAME-$VERSION-linux-x86_64.tar.gz" "$(basename "$TAR")" )

echo "== 5/5 產生校驗碼 =="
( cd "$DIST" && sha256sum ./*.deb ./*.tar.gz > SHA256SUMS )
rm -rf "$STAGE" "$DEB" "$DIST/tar" "$ICONS"
ls -lh "$DIST"
