#!/usr/bin/env bash
# ============================================================
#  XHCOS Lite ForThinPC 2.0.0 — 瘦客户机无鼠标变体构建
#  ============================================================
#  复用已构建的 XHCOS-Lite-Mint-2.0.0-amd64.iso，叠加：
#    1) live 自动登录（键盘进桌面，直接验证兼容性）
#    2) 键盘安装器 /opt/xhcos/xhcos-autoinstall.sh
#       + systemd 服务（grub 内核参数 xhcos.autoinstall 触发，全自动）
#       + 桌面启动器「安装 XHCOS 到本机（键盘）」
#    3) grub 默认第一项 = 自动安装（带 xhcos.autoinstall 参数），上电即装；
#       倒计时内按 ↓ 选 live 项可改为仅验证。AUTO_TIMEOUT=0 即零等待直装。
#  不需要 Calamares、不需要鼠标。
#
#  运行（WSL2 root）：  sudo bash /mnt/d/xhcos-lite-mint/build-forthinpc.sh
#  产物：D:\xhcos-lite-mint\XHCOS-Lite-ForThinPC-2.0.0-amd64.iso
# ============================================================

# ---------- 横幅 + 日志 ----------
echo "══════════════════════════════════════════════════════"
echo " XHCOS Lite ForThinPC 2.0.0 — 瘦客户机无鼠标变体"
echo " $(date '+%F %T')"
echo "══════════════════════════════════════════════════════"
DROOT="/mnt/d/xhcos-lite-mint"
BUILD_LOG="$DROOT/forthinpc.$(date +%Y%m%d-%H%M%S).log"
mkdir -p "$DROOT"
exec > >(tee -a "$BUILD_LOG") 2>&1

set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
[[ $EUID -eq 0 ]] || { echo "!! 必须 root：sudo bash $0"; exit 1; }

# ---------- 0. 源 ISO：优先已构建的 XHCOS-Lite，否则回退 linuxmint ----------
SRC_ISO=""
if [ -f "$DROOT/XHCOS-Lite-Mint-2.0.0-amd64.iso" ]; then
  SRC_ISO="$DROOT/XHCOS-Lite-Mint-2.0.0-amd64.iso"
  echo "==> 复用已构建 ISO: $SRC_ISO"
elif [ -n "${SRC_ISO_ARG:-}" ]; then
  SRC_ISO="$SRC_ISO_ARG"
else
  for d in /mnt/d /mnt/d/xhcos-lite-mint /mnt/c/Users/xihaochen/Downloads; do
    [ -d "$d" ] || continue
    f=$(find "$d" -maxdepth 4 -iname "XHCOS-Lite-Mint*.iso" 2>/dev/null | head -1) \
      || f=$(find "$d" -maxdepth 4 -iname "linuxmint*.iso" 2>/dev/null | head -1) || true
    [ -n "$f" ] && SRC_ISO="$f" && break
  done
fi
if [ -z "$SRC_ISO" ] || [ ! -f "$SRC_ISO" ]; then
  echo "!! 找不到源 ISO。请先跑 build-xhcos-mint.sh 产出 XHCOS-Lite-Mint-2.0.0-amd64.iso，"
  echo "   或显式指定：SRC_ISO_ARG=/mnt/d/linuxmint-22.3-xfce-64bit.iso sudo bash $0"
  exit 1
fi
echo "源 ISO: $SRC_ISO ($(du -h "$SRC_ISO"|cut -f1))"

# ---------- 7-Zip 检测 ----------
SEVENZ=""; SEVENZ_WIN=0
if command -v 7z >/dev/null 2>&1; then SEVENZ="7z"
elif command -v 7za >/dev/null 2>&1; then SEVENZ="7za"
else
  for p in "/mnt/c/Program Files/7-Zip/7z.exe" "/mnt/c/Program Files (x86)/7-Zip/7z.exe" \
           "/mnt/c/ProgramData/chocolatey/bin/7z.exe" "/mnt/c/Program Files/NanaZip/7z.exe"; do
    [ -x "$p" ] && SEVENZ="$p" && SEVENZ_WIN=1 && break
  done
fi
[ -n "$SEVENZ" ] || { echo "!! 需要 7-Zip（见 build-xhcos-mint.sh 说明）"; exit 1; }
echo "使用 7z: $SEVENZ"

# ---------- 工作位置（全部 D 盘）----------
WORK_IMG="$DROOT/work-forthinpc.img"
WORK_IMG_MIN=18
WORK="/xhcos-work-forthinpc"
ISO_OUT="${ISO_OUT:-$DROOT/XHCOS-Lite-ForThinPC-2.0.0-amd64.iso}"
EXTRACT="$DROOT/iso-forthinpc"

cleanup_mount(){
  for m in "$WORK/edit/proc" "$WORK/edit/sys" "$WORK/edit/dev/pts" "$WORK/edit/dev" "$WORK/edit/run"; do
    mountpoint -q "$m" 2>/dev/null && umount -l "$m" 2>/dev/null || true
  done
  mountpoint -q "$WORK" 2>/dev/null && umount -l "$WORK" 2>/dev/null || true
}
trap cleanup_mount EXIT

# ---------- 1. 宿主工具 ----------
echo "==> 安装宿主工具"
for pkg in xorriso squashfs-tools rsync e2fsprogs p7zip-full parted; do
  dpkg -s "$pkg" >/dev/null 2>&1 || apt-get install -y "$pkg" 2>/dev/null \
    || echo "   !! $pkg 未装（可能无网络），用到时再报错"
done

# ---------- 2. ext4 工作镜像 ----------
echo "==> 准备 ext4 工作镜像"
NEED=$(( WORK_IMG_MIN*1024*1024*1024 ))
if [ ! -f "$WORK_IMG" ] || [ "$(stat -c %s "$WORK_IMG" 2>/dev/null||echo 0)" -lt "$NEED" ]; then
  rm -f "$WORK_IMG"; truncate -s ${WORK_IMG_MIN}G "$WORK_IMG"; mkfs.ext4 -F -q "$WORK_IMG"
fi
mkdir -p "$WORK"
if ! mountpoint -q "$WORK"; then
  mount -o loop "$WORK_IMG" "$WORK" 2>"$DROOT/wyse-mount.err" \
    || { echo "!! loop 挂载失败："; tail -5 "$DROOT/wyse-mount.err"; exit 1; }
fi

# ---------- 3. 解包 ISO ----------
echo "==> 7z 解包 -> $EXTRACT"
if [ ! -f "$EXTRACT/casper/filesystem.squashfs" ] && [ ! -f "$EXTRACT/live/filesystem.squashfs" ]; then
  rm -rf "$EXTRACT"; mkdir -p "$EXTRACT"
  if [ "$SEVENZ_WIN" -eq 1 ]; then
    winiso=$(echo "$SRC_ISO" | sed -E 's#^/mnt/([a-z])/#\U\1:/#; s#/#\\#g')
    "$SEVENZ" x -y "-oD:\\xhcos-lite-mint\\iso-wyse" "$winiso" > "$DROOT/7z-wyse.log" 2>&1 \
      || { echo "!! 7z 失败"; tail -15 "$DROOT/7z-wyse.log"; exit 1; }
  else
    "$SEVENZ" x -y "-o$EXTRACT" "$SRC_ISO" > "$DROOT/7z-wyse.log" 2>&1 \
      || { echo "!! 7z 失败"; tail -15 "$DROOT/7z-wyse.log"; exit 1; }
  fi
fi
SQ=""
[ -f "$EXTRACT/casper/filesystem.squashfs" ] && SQ="$EXTRACT/casper/filesystem.squashfs"
[ -f "$EXTRACT/live/filesystem.squashfs" ]   && SQ="$EXTRACT/live/filesystem.squashfs"
[ -n "$SQ" ] || { echo "!! 找不到 filesystem.squashfs"; exit 1; }
echo "    squashfs: $SQ ($(du -h "$SQ"|cut -f1))"

# 复制到 ext4
rm -rf "$WORK/iso" "$WORK/edit"; mkdir -p "$WORK/iso" "$WORK/edit"
rsync -a "$EXTRACT/" "$WORK/iso/" 2>/dev/null || cp -a "$EXTRACT/." "$WORK/iso/"

# ---------- 4. unsquashfs ----------
echo "==> unsquashfs"
unsquashfs -f -d "$WORK/edit" "$SQ"

# ---------- 5. ForThinPC 叠加改造 ----------
echo "==> ForThinPC 叠加：自动登录 + 键盘安装器"
mount --bind /proc    "$WORK/edit/proc"
mount --bind /sys     "$WORK/edit/sys"
mount --bind /dev     "$WORK/edit/dev"
mount --bind /dev/pts "$WORK/edit/dev/pts"
mount --bind /run     "$WORK/edit/run" 2>/dev/null || true
cp --remove-destination /etc/resolv.conf "$WORK/edit/etc/resolv.conf" 2>/dev/null || true

# 5a. live 自动登录（Mint live 用户是 mint）
cat > "$WORK/edit/etc/lightdm/lightdm.conf" <<'EOF'
[Seat:*]
greeter-session=lightdm-gtk-greeter
user-session=xfce
autologin-user=mint
autologin-session=xfce
EOF
# 顺手把 /etc/skel 也设自动登录（装好后新用户不卡在登录界面）
sed -i '/autologin-user=/d' "$WORK/edit/etc/lightdm/lightdm.conf" 2>/dev/null || true
grep -q '^autologin-user=mint' "$WORK/edit/etc/lightdm/lightdm.conf" \
  || echo "autologin-user=mint" >> "$WORK/edit/etc/lightdm/lightdm.conf"

# 5b. 键盘安装器脚本
mkdir -p "$WORK/edit/opt/xhcos"
cp "$SCRIPT_DIR/xhcos-autoinstall.sh" "$WORK/edit/opt/xhcos/xhcos-autoinstall.sh"
chmod +x "$WORK/edit/opt/xhcos/xhcos-autoinstall.sh"

# 5c. 桌面启动器（替换原 Calamares「安装 XHCOS」入口，避免鼠标依赖 + 假入口）
cat > "$WORK/edit/usr/share/applications/xhcos-autoinstall.desktop" <<'EOF'
[Desktop Entry]
Version=1.0
Type=Application
Name=安装 XHCOS 到本机（键盘）
Comment=无需鼠标：自动分区并安装到 eMMC
Exec=xterm -e "sudo /opt/xhcos/xhcos-autoinstall.sh"
Icon=drive-harddisk
Terminal=true
Categories=System;
EOF
# 把桌面上的旧安装图标改名指向我们的脚本（Mint live 桌面在 /home/mint/Desktop）
for d in "$WORK/edit/home/mint/Desktop"/*.desktop "$WORK/edit/etc/skel/Desktop"/*.desktop; do
  [ -f "$d" ] || continue
  if grep -qi "calamares" "$d" || grep -qi "安装 Linux Mint\|Install Linux Mint" "$d"; then
    cp "$WORK/edit/usr/share/applications/xhcos-autoinstall.desktop" "$d"
  fi
done

# 5d. systemd 自动安装服务（grub 内核参数 xhcos.autoinstall 触发，全自动）
cat > "$WORK/edit/etc/systemd/system/xhcos-autoinstall.service" <<'EOF'
[Unit]
Description=XHCOS Lite ForThinPC auto-install (thin client, no mouse)
ConditionKernelCommandLine=xhcos.autoinstall
After=network.target

[Service]
Type=oneshot
ExecStart=/opt/xhcos/xhcos-autoinstall.sh --yes
TimeoutStartSec=0

[Install]
WantedBy=multi-user.target
EOF
chroot "$WORK/edit" systemctl enable xhcos-autoinstall.service 2>/dev/null || true

# 收尾 umount
umount -l "$WORK/edit/run" "$WORK/edit/dev/pts" "$WORK/edit/dev" "$WORK/edit/sys" "$WORK/edit/proc" 2>/dev/null || true
rm -f "$WORK/edit/etc/resolv.conf"

# ---------- 6. resquashfs ----------
echo "==> 重新打包 squashfs"
FREE_GB=$(df -BG "$WORK" 2>/dev/null | awk 'NR==2{gsub("G","",$4); print $4+0}')
if [ "${FREE_GB:-0}" -lt 6 ]; then
  echo "!! 工作镜像空间不足 ($FREE_GB GB)"; exit 1
fi
SQ_REL="${SQ#$EXTRACT/}"
SQ_OUT="$WORK/iso/$SQ_REL"
rm -f "$SQ_OUT"
mksquashfs "$WORK/edit" "$SQ_OUT" -comp zstd -Xcompression-level 15 -b 1048576 \
  -no-progress -noappend -processors "$(nproc)"
du -sx --block-size=1 "$WORK/edit" 2>/dev/null | cut -f1 > "$(dirname "$SQ_OUT")/filesystem.size" || true

# ---------- 7. grub/isolinux 启动菜单：注入默认自动安装项（上电即装） ----------
echo "==> 启动菜单品牌化 + 注入默认自动安装项（无鼠标，开机直接装）"
GRUB_CFG="$WORK/iso/boot/grub/grub.cfg"
# 默认自动安装倒计时（秒）。设 AUTO_TIMEOUT=0 即上电零等待直接开装；
# 想保留「进场先看一眼」可设大一点，期间按 ↓ 选不带参数的 live 项即可验证。
AUTO_TIMEOUT="${AUTO_TIMEOUT:-10}"
AUTO_TITLE="XHCOS Auto-Install (ForThinPC)"
[ -f "$GRUB_CFG" ] && sed -i 's/Linux Mint/XHCOS/g; s/Ubuntu/XHCOS/g; s/\bmaybe-ubiquity\b//g' "$GRUB_CFG"
for cfg in "$WORK/iso/isolinux/isolinux.cfg" "$WORK/iso/isolinux/menu.cfg" "$WORK/iso/isolinux/txt.cfg"; do
  [ -f "$cfg" ] && sed -i 's/Linux Mint/XHCOS/g; s/Ubuntu/XHCOS/g' "$cfg" 2>/dev/null || true
done
if [ -f "$GRUB_CFG" ]; then
python3 - "$GRUB_CFG" "$AUTO_TITLE" "$AUTO_TIMEOUT" <<'PY'
import sys,re
p,title,timeout=sys.argv[1],sys.argv[2],sys.argv[3]
s=open(p,encoding='utf-8',errors='replace').read()
m=re.search(r'menuentry\s+[^\n]*\{\n(.*?)\n\}', s, re.S)
if not m:
    print("!! 未找到 menuentry，跳过自动安装注入（请确认 grub.cfg 结构）")
else:
    body=m.group(1)
    # 克隆首条启动项，并在 linux 行（--- 之前）追加 xhcos.autoinstall
    if ' ---' in body:
        newbody=re.sub(r'(linux\s+[^\n]*?)(\s+---\s)', r'\1 xhcos.autoinstall\2', body, count=1)
    else:
        newbody=re.sub(r'(linux\s+[^\n]*?)(\n)', r'\1 xhcos.autoinstall\2', body, count=1)
    newentry='menuentry "%s" {\n%s\n}\n' % (title, newbody)
    s=s[:m.start()]+newentry+s[m.start():]
    # 默认项 + 超时
    if re.search(r'^set\s+default\s*=', s, re.M):
        s=re.sub(r'^set\s+default\s*=.*$', 'set default="%s"'%title, s, flags=re.M)
    else:
        s='set default="%s"\n'%title+s
    if re.search(r'^set\s+timeout\s*=', s, re.M):
        s=re.sub(r'^set\s+timeout\s*=.*$', 'set timeout=%s'%timeout, s, flags=re.M)
    else:
        s='set timeout=%s\n'%timeout+s
    open(p,'w',encoding='utf-8').write(s)
    print("grub 注入完成：默认项=%s，超时=%ss" % (title, timeout))
PY
fi

# ---------- 8. xorriso 重建 ----------
echo "==> 重建 iso-hybrid -> $ISO_OUT"
MBR="$WORK/isohdpfx.bin"
dd if="$SRC_ISO" of="$MBR" bs=1 count=432 2>/dev/null || true
[ -f "$WORK/iso/isolinux/isolinux.bin" ] || xorriso -indev "$SRC_ISO" -osirrox on \
  -extract isolinux/isolinux.bin "$WORK/iso/isolinux/isolinux.bin" 2>/dev/null || true
xorriso -as mkisofs \
  -iso-level 3 -full-iso9660-filenames \
  -volid "XHCOS_LITE_THINPC_2_0_0" \
  -eltorito-boot isolinux/isolinux.bin -eltorito-catalog isolinux/boot.cat \
  -no-emul-boot -boot-load-size 4 -boot-info-table \
  -eltorito-alt-boot -e boot/grub/efi.img -no-emul-boot \
  -isohybrid-gpt-basdat -isohybrid-mbr "$MBR" \
  -c isolinux/boot.cat -o "$ISO_OUT" "$WORK/iso"

echo "══════════════════════════════════════════════════════"
echo "完成 -> $ISO_OUT"
ls -lh "$ISO_OUT"
echo "日志: $BUILD_LOG"
echo "══════════════════════════════════════════════════════"
