#!/usr/bin/env bash
# ============================================================================
#  Hasaki - Bo cai in tem ma vach cho UBUNTU (barcode.hasaki.vn) - v1.0 2026-08-06
#  Chay:  sudo bash HasakiBarcodeSetup.sh
#  Tu dong lam:
#    1. Cai CUPS neu chua co; bat dich vu
#    2. Tat "Dau trang va chan trang" khi in cho Chrome/Chromium/Edge (policy)
#    3. Tim hang doi may in tem (TSC PE200 / Honeywell PC42t...); chua co thi
#       tu tao neu he thong da co driver phu hop
#    4. Them 2 kho giay chuan vao PPD cua hang doi:
#         Hasaki 88x10  (88.0 x 10.0 mm - cuon tem 21x10, 4 tem/hang)
#         Hasaki 105x22 (105.0 x 22.0 mm - cuon tem 35x22, 3 tem/hang)
#       -> Chrome se thay 2 kho nay trong hop thoai in
#  Chay lai nhieu lan an toan (idempotent). Log: /tmp/hasaki-barcode-setup.log
#  Go bo: xoa 2 kho trong /etc/cups/ppd/<queue>.ppd (co ban sao .hasaki-bak),
#         xoa /etc/opt/chrome/policies/managed/hasaki-barcode.json (+ chromium/edge)
#  LUU Y: cai lai / cap nhat driver may in se ghi de PPD -> chay lai file nay.
# ============================================================================
set -u
[ "$(id -u)" -eq 0 ] || exec sudo bash "$0" "$@"
LOG=/tmp/hasaki-barcode-setup.log
exec > >(tee "$LOG") 2>&1

echo "=== Hasaki - Cai dat in tem ma vach (Ubuntu) ==="
echo ""

# ---------- 1. CUPS ----------
echo "--- Buoc 1/4: kiem tra CUPS ---"
if ! command -v lpstat >/dev/null 2>&1; then
  echo "  Chua co CUPS - dang cai (can mang)..."
  apt-get update -qq && apt-get install -y -qq cups
fi
systemctl enable --now cups >/dev/null 2>&1 || true
echo "  [OK] CUPS san sang"

# ---------- 2. Chrome/Chromium/Edge policy ----------
echo "--- Buoc 2/4: tat 'Dau trang va chan trang' (Chrome/Chromium/Edge) ---"
for d in /etc/opt/chrome/policies/managed \
         /etc/chromium/policies/managed \
         /etc/chromium-browser/policies/managed \
         /etc/opt/edge/policies/managed; do
  mkdir -p "$d"
  printf '{\n  "PrintHeaderFooter": false\n}\n' > "$d/hasaki-barcode.json"
done
echo "  [OK] Da tat qua chinh sach may"

# ---------- 3. Hang doi may in ----------
echo "--- Buoc 3/4: tim may in tem ---"
MATCH='[Tt][Ss][Cc]|PE200|PE-200|[Hh]oneywell|PC42'
QUEUE=""
while IFS= read -r line; do
  q=${line#device for }; q=${q%%:*}
  uri=${line#*: }
  if echo "$uri" | grep -qE "$MATCH"; then QUEUE=$q; break; fi
done < <(lpstat -v 2>/dev/null || true)

if [ -z "$QUEUE" ]; then
  URI=$(lpinfo -v 2>/dev/null | awk '/usb:\/\//{print $2}' | grep -E "$MATCH" | head -1 || true)
  if [ -z "${URI:-}" ]; then
    echo "  [CHU Y] Chua thay may in tem cam USB. Cam may in, bat nguon roi chay lai."
    echo "          (Kho giay se duoc them khi co hang doi may in.)"
    echo ""
    echo "=== XONG MOT PHAN - chay lai sau khi cam may in ==="
    exit 0
  fi
  MODEL=$(lpinfo -m 2>/dev/null | grep -iE 'tsc|honeywell|pc42' | head -1 | awk '{print $1}' || true)
  if [ -z "${MODEL:-}" ]; then
    echo "  [CHU Y] Thay may in ($URI) nhung he thong CHUA co driver TSC/Honeywell."
    echo "          Cai driver Linux cua hang (TSC: tscprinters.com > Support > Download;"
    echo "          Honeywell: sps.honeywell.com > Software > CUPS driver) roi chay lai."
    exit 1
  fi
  QUEUE="TemHasaki"
  lpadmin -p "$QUEUE" -E -v "$URI" -m "$MODEL"
  echo "  [OK] Da tao hang doi '$QUEUE' ($URI)"
else
  echo "  [OK] Dung hang doi co san: '$QUEUE'"
fi
lpadmin -d "$QUEUE" 2>/dev/null || true   # dat lam may in mac dinh

# ---------- 4. Them kho giay vao PPD ----------
echo "--- Buoc 4/4: them kho giay Hasaki 88x10 + Hasaki 105x22 ---"
PPD="/etc/cups/ppd/$QUEUE.ppd"
if [ ! -f "$PPD" ]; then
  echo "  [LOI] Khong thay $PPD - bao IT (system@hasakigroup.vn), gui kem $LOG"
  exit 1
fi
cp -n "$PPD" "$PPD.hasaki-bak" 2>/dev/null || true
python3 - "$PPD" <<'PYEOF'
import sys
path = sys.argv[1]
src = open(path, encoding='utf-8', errors='replace').read()
if 'Hasaki88x10' in src:
    print('  [OK] PPD da co kho Hasaki (bo qua)')
    sys.exit(0)
pt = lambda v: round(v / 25.4 * 72, 2)
SIZES = [('Hasaki88x10', 'Hasaki 88x10', 88.0, 10.0),
         ('Hasaki105x22', 'Hasaki 105x22', 105.0, 22.0)]
def entry(kind, key, disp, w, h):
    if kind in ('PageSize', 'PageRegion'):
        code = '<</PageSize[%s %s]/ImagingBBox null>>setpagedevice' % (pt(w), pt(h))
        return '*%s %s/%s: "%s"\n' % (kind, key, disp, code)
    if kind == 'ImageableArea':
        return '*ImageableArea %s/%s: "0 0 %s %s"\n' % (key, disp, pt(w), pt(h))
    return '*PaperDimension %s/%s: "%s %s"\n' % (key, disp, pt(w), pt(h))
out, done = [], set()
for line in src.splitlines(keepends=True):
    if line.startswith('*CloseUI: *PageSize') and 'ps' not in done:
        out += [entry('PageSize', *s) for s in SIZES]; done.add('ps')
    if line.startswith('*CloseUI: *PageRegion') and 'pr' not in done:
        out += [entry('PageRegion', *s) for s in SIZES]; done.add('pr')
    out.append(line)
if 'ps' not in done or 'pr' not in done:
    print('  [LOI] PPD khong co khoi PageSize/PageRegion chuan - bao IT kem file log')
    sys.exit(1)
src2 = ''.join(out)
for kind in ('ImageableArea', 'PaperDimension'):
    lines = src2.splitlines(keepends=True)
    idx = [i for i, l in enumerate(lines) if l.startswith('*' + kind)]
    add = [entry(kind, *s) for s in SIZES]
    if idx:
        lines[idx[-1] + 1:idx[-1] + 1] = add
    else:
        lines += add
    src2 = ''.join(lines)
open(path, 'w', encoding='utf-8').write(src2)
print('  [OK] Da them kho Hasaki 88x10 + Hasaki 105x22 vao PPD')
PYEOF
RC=$?
[ $RC -eq 0 ] || exit $RC
lpoptions -p "$QUEUE" -o media=Hasaki88x10 >/dev/null 2>&1 || true
systemctl restart cups

echo ""
echo "=== XONG! Cach in: mo Chrome vao  barcode.hasaki.vn  go ma -> Enter ==="
echo "Lan dau tren may nay, trong hop thoai in chon 1 lan (Chrome se tu nho):"
echo "  - May in dich : $QUEUE"
echo "  - Kho giay    : Hasaki 88x10 (cuon 21x10)  hoac  Hasaki 105x22 (cuon 35x22)"
echo "  - Le          : Khong co (None)   |   Ty le: Tuy chinh -> 100"
echo "Xem truoc phai THAY ma vach roi moi bam In. Chi tiet: barcode.hasaki.vn/huong-dan.pdf"
