#!/usr/bin/env bash
set -Eeuo pipefail
export DEBIAN_FRONTEND=noninteractive

BASE="/opt/dailoios/canon-lbp2900"
LOG="/var/log/dailoios-canon-lbp2900-install.log"

exec >>"$LOG" 2>&1
echo "===== $(date -Is) Bắt đầu cài Canon LBP2900 ====="

dpkg --add-architecture i386 || true
dpkg --configure -a || true

shopt -s nullglob
DEBS=("$BASE"/debs/*.deb)

if (( ${#DEBS[@]} == 0 )); then
  echo "Không có gói .deb trong payload."
  exit 1
fi

# Cài nhiều lượt để xử lý thứ tự phụ thuộc giữa các gói offline.
for pass in 1 2 3; do
  echo "Lượt cài $pass"
  dpkg -i --force-confold "${DEBS[@]}" || true
  dpkg --configure -a || true
done

# Khôi phục kho PPD/model.
if [[ -d "$BASE/backup/ppd" ]]; then
  mkdir -p /usr/share/ppd
  cp -a "$BASE/backup/ppd/." /usr/share/ppd/ || true
fi

if [[ -d "$BASE/backup/model" ]]; then
  mkdir -p /usr/share/cups/model
  cp -a "$BASE/backup/model/." /usr/share/cups/model/ || true
fi

if [[ -d "$BASE/backup/ppd" && -d /etc/cups ]]; then
  mkdir -p /etc/cups/ppd
  cp -a "$BASE/backup/ppd/." /etc/cups/ppd/ || true
  chmod 755 /etc/cups/ppd
  chmod 640 /etc/cups/ppd/*.ppd 2>/dev/null || true
fi

# Tạo dịch vụ CAPT ổn định.
cat > /etc/systemd/system/ccpd.service <<'SERVICE'
[Unit]
Description=Canon CAPT Daemon
After=cups.service
Requires=cups.service

[Service]
Type=forking
ExecStart=/usr/sbin/ccpd
ExecStop=/usr/bin/killall ccpd
Restart=on-failure
RestartSec=3

[Install]
WantedBy=multi-user.target
SERVICE

systemctl daemon-reload
systemctl enable --now cups
systemctl enable ccpd.service

# Đăng ký hàng đợi LBP2900. Không báo lỗi nếu thiết bị chưa cắm.
if command -v lpadmin >/dev/null 2>&1; then
  lpadmin -x LBP2900 2>/dev/null || true

  PPD=""
  for candidate in \
    /usr/share/cups/model/CNCUPSLBP2900CAPTK.ppd \
    /usr/share/cups/model/CNCUPSLBP2900CAPTK.ppd.gz \
    /usr/share/ppd/CNCUPSLBP2900CAPTK.ppd \
    /usr/share/ppd/CNCUPSLBP2900CAPTK.ppd.gz
  do
    [[ -f "$candidate" ]] && PPD="$candidate" && break
  done

  if [[ -n "$PPD" ]]; then
    lpadmin -p LBP2900 -m "$PPD" -v ccp://localhost:59687 -E || true
  fi
fi

if command -v ccpdadmin >/dev/null 2>&1; then
  ccpdadmin -x LBP2900 2>/dev/null || true
  ccpdadmin -p LBP2900 -o /dev/usb/lp0 2>/dev/null || \
  ccpdadmin -p LBP2900 -o /dev/canonLBP2900 2>/dev/null || true
fi

systemctl restart cups
systemctl restart ccpd.service || true

touch /var/lib/dailoios-canon-lbp2900-installed
echo "===== $(date -Is) Hoàn tất ====="
exit 0
