#!/bin/bash
# ============================================
#  ktouch 日志采集与打包脚本
#  按类别分目录存储，方便排查触摸屏问题
# ============================================

set -e

LOG_PATH="/opt/ktouch"
NOW=$(date "+%m%d-%H%M%S")
TMP_BASE="/tmp/klog_$NOW"

# ---------- 子目录定义 ----------
DIR_SYSTEM="$TMP_BASE/system"
DIR_HARDWARE="$TMP_BASE/hardware"
DIR_APP="$TMP_BASE/app"
DIR_PROGRAM="$TMP_BASE/program"

mkdir -p "$DIR_SYSTEM" "$DIR_HARDWARE" "$DIR_APP" "$DIR_PROGRAM"

echo "正在采集日志（部分操作需 sudo）..."

# ============================================
#  1. 系统日志  ───  system/
# ============================================
echo "  采集系统日志..."

# journalctl（系统服务日志）
if command -v journalctl &>/dev/null; then
    sudo journalctl -b -n 5000 --no-pager > "$DIR_SYSTEM/journal_boot.txt" 2>/dev/null || true
    sudo journalctl -u ktouch_daemon --no-pager > "$DIR_SYSTEM/journal_ktouch.txt" 2>/dev/null || true
    sudo journalctl -u lightdm --no-pager > "$DIR_SYSTEM/journal_lightdm.txt" 2>/dev/null || true
    sudo journalctl -u sddm --no-pager > "$DIR_SYSTEM/journal_sddm.txt" 2>/dev/null || true
fi

# dmesg 内核日志
dmesg > "$DIR_SYSTEM/dmesg.txt" 2>/dev/null || true

# 传统系统日志文件
sudo cp /var/log/syslog*    "$DIR_SYSTEM/" 2>/dev/null || true
sudo cp /var/log/messages*  "$DIR_SYSTEM/" 2>/dev/null || true
sudo cp /var/log/kern*      "$DIR_SYSTEM/" 2>/dev/null || true
sudo cp /var/log/boot*      "$DIR_SYSTEM/" 2>/dev/null || true
sudo cp /var/log/Xorg*      "$DIR_SYSTEM/" 2>/dev/null || true
sudo cp /var/log/dpkg*      "$DIR_SYSTEM/" 2>/dev/null || true
sudo cp /var/log/apt/*      "$DIR_SYSTEM/" 2>/dev/null || true

# 显示管理器日志
[ -d /var/log/lightdm ] && sudo cp -r /var/log/lightdm "$DIR_SYSTEM/" 2>/dev/null || true
[ -d /var/log/sddm   ] && sudo cp -r /var/log/sddm   "$DIR_SYSTEM/" 2>/dev/null || true

# 系统版本
if [ -f /etc/kylin-release ]; then
    cat /etc/os-release /etc/kylin-release 2>/dev/null > "$DIR_SYSTEM/os_version.txt" || true
elif [ -f /etc/uos-release ]; then
    cat /etc/os-release /etc/uos-release /etc/os-version 2>/dev/null > "$DIR_SYSTEM/os_version.txt" || true
else
    cat /etc/os-release 2>/dev/null > "$DIR_SYSTEM/os_version.txt" || true
fi

# ============================================
#  2. 硬件信息  ───  hardware/
# ============================================
echo "  采集硬件信息..."

export DISPLAY=:0

# X11 输入设备列表 + 属性（按设备分离）
xinput list > "$DIR_HARDWARE/xinput_list.txt" 2>/dev/null || true
for id in $(xinput list --id-only 2>/dev/null); do
    echo "========== device id: $id ==========" >> "$DIR_HARDWARE/xinput_props.txt"
    xinput list-props "$id" >> "$DIR_HARDWARE/xinput_props.txt" 2>/dev/null || true
    echo "" >> "$DIR_HARDWARE/xinput_props.txt"
done

# xrandr 显示器信息
xrandr --verbose > "$DIR_HARDWARE/xrandr.txt" 2>/dev/null || true

# libinput 设备列表
libinput list-devices > "$DIR_HARDWARE/libinput_devices.txt" 2>/dev/null || true

# /proc/bus/input/devices（内核视角的输入设备）
cat /proc/bus/input/devices > "$DIR_HARDWARE/input_devices.txt" 2>/dev/null || true

# 每个 event 设备的 udev 信息
mkdir -p "$DIR_HARDWARE/evdev/"
for ev in /dev/input/event*; do
    [ -e "$ev" ] || continue
    name=$(basename "$ev")
    echo "========== 设备路径: $ev ==========" >> "$DIR_HARDWARE/evdev/${name}_udev.txt"
    udevadm info --query=all --name="$ev" >> "$DIR_HARDWARE/evdev/${name}_udev.txt" 2>/dev/null || true

    # 尝试用 evtest 采集设备支持的事件类型（需要 root）
    if command -v evtest &>/dev/null; then
        sudo evtest --info "$ev" > "$DIR_HARDWARE/evdev/${name}_evtest.txt" 2>/dev/null || true &
    fi
done
wait 2>/dev/null || true

# 每个 event 设备的能力位（capabilities）
for ev in /dev/input/event*; do
    [ -e "$ev" ] || continue
    name=$(basename "$ev")
    echo "========== $ev ==========" >> "$DIR_HARDWARE/evdev/${name}_caps.txt"
    if command -v evemu-describe &>/dev/null; then
        evemu-describe "$ev" >> "$DIR_HARDWARE/evdev/${name}_caps.txt" 2>/dev/null || true
    fi
done

# DRM 显示器信息
mkdir -p "$DIR_HARDWARE/drm"
for card in /sys/class/drm/card*-*; do
    [ -e "$card" ] || continue
    card_name=$(basename "$card")
    mkdir -p "$DIR_HARDWARE/drm/$card_name"
    for attr in status enabled modes dpms edid; do
        [ -f "$card/$attr" ] && cp "$card/$attr" "$DIR_HARDWARE/drm/$card_name/$attr" 2>/dev/null || true
    done
done

# USB 设备树
lsusb       >  "$DIR_HARDWARE/lsusb.txt" 2>/dev/null || true
lsusb -t    >> "$DIR_HARDWARE/lsusb.txt" 2>/dev/null || true
lsusb -v    >  "$DIR_HARDWARE/lsusb_verbose.txt" 2>/dev/null || true

# PCI 设备
lspci -k    >  "$DIR_HARDWARE/lspci.txt" 2>/dev/null || true

# 块设备
lsblk -f    >  "$DIR_HARDWARE/lsblk.txt" 2>/dev/null || true

# 硬件信息（需要 root）
sudo dmidecode > "$DIR_HARDWARE/dmidecode.txt" 2>/dev/null || true

# udev 规则
[ -d /etc/udev/rules.d ] && cp -r /etc/udev/rules.d "$DIR_HARDWARE/udev_rules/" 2>/dev/null || true
[ -d /lib/udev/rules.d  ] && cp -r /lib/udev/rules.d  "$DIR_HARDWARE/udev_rules_lib/" 2>/dev/null || true

echo "程序版本: ktouch V2" > "$DIR_HARDWARE/ktouch_version.txt"
[ -f "$LOG_PATH/kscreen-remap-daemon" ] && head -5 "$LOG_PATH/kscreen-remap-daemon" >> "$DIR_HARDWARE/ktouch_version.txt" 2>/dev/null || true

# ============================================
#  3. 程序日志与配置  ───  app/
# ============================================
echo "  采集程序日志和配置..."

# 程序日志
[ -f "$LOG_PATH/touchscreen.log"  ] && cp "$LOG_PATH/touchscreen.log"  "$DIR_APP/touchscreen.log"  2>/dev/null || true
[ -f "$LOG_PATH/install.log"      ] && cp "$LOG_PATH/install.log"      "$DIR_APP/install.log"      2>/dev/null || true
[ -f "$LOG_PATH/sub_modules.log"  ] && cp "$LOG_PATH/sub_modules.log"  "$DIR_APP/sub_modules.log"  2>/dev/null || true
# 日志轮转文件
for f in "$LOG_PATH/"*.log.*; do
    [ -f "$f" ] && cp "$f" "$DIR_APP/" 2>/dev/null || true
done

# 触摸屏配置
[ -f "$LOG_PATH/config"          ] && cp "$LOG_PATH/config"          "$DIR_APP/config"            2>/dev/null || true
[ -f "$LOG_PATH/touch_dis_table.txt" ] && cp "$LOG_PATH/touch_dis_table.txt" "$DIR_APP/"           2>/dev/null || true

# 显示器自定义分辨率配置
[ -d "$LOG_PATH/display_config"  ] && cp -r "$LOG_PATH/display_config" "$DIR_APP/display_config"   2>/dev/null || true

# /tmp/ktouch 缓存文件
if [ -d /tmp/ktouch ]; then
    mkdir -p "$DIR_APP/tmp_cache"
    cp -r /tmp/ktouch/* "$DIR_APP/tmp_cache/" 2>/dev/null || true
fi

# systemd 服务文件
[ -f /etc/systemd/system/ktouch_daemon.service ] && sudo cp /etc/systemd/system/ktouch_daemon.service "$DIR_APP/service_file" 2>/dev/null || true

# ============================================
#  4. 程序本体  ───  program/
# ============================================
echo "  采集程序文件清单..."

# 文件列表（不复制整个目录，只记录清单 + md5）
find /opt/ktouch -type f 2>/dev/null | sort > "$DIR_PROGRAM/file_list.txt"
find /opt/ktouch -type f -exec md5sum {} \; 2>/dev/null | sort > "$DIR_PROGRAM/file_md5.txt" || true

# 复制关键脚本（用于分析代码逻辑）
mkdir -p "$DIR_PROGRAM/scripts"
for s in kscreen-remap kscreen-remap-daemon kscreen-setup kscreen-debug kscreen-fix-daemon kscreen-log; do
    [ -f "$LOG_PATH/$s" ] && cp "$LOG_PATH/$s" "$DIR_PROGRAM/scripts/" 2>/dev/null || true
done
[ -f "$LOG_PATH/display_monitor.py" ] && cp "$LOG_PATH/display_monitor.py" "$DIR_PROGRAM/scripts/" 2>/dev/null || true

# ============================================
#  5. 整理 & 打包
# ============================================
echo "  整理并打包..."

# 统一权限
sudo chmod 755 -R "$TMP_BASE" 2>/dev/null || true

# 生成文件清单
find "$TMP_BASE" -type f | sort > "$TMP_BASE/_file_index.txt"

# 打包
echo "正在生成压缩包..."
cd /tmp
tar -czf ~/ktouch_log-"$NOW".tar.gz "klog_$NOW"

# 清理
rm -rf "$TMP_BASE"

echo ""
echo "============================================"
echo "  日志采集完成"
echo "  文件: ~/ktouch_log-${NOW}.tar.gz"
echo "============================================"
echo ""
echo "压缩包结构:"
echo "  system/    - 系统日志（journalctl, dmesg, syslog, Xorg...）"
echo "  hardware/  - 硬件信息（xinput, xrandr, libinput, udev, evdev...）"
echo "  app/       - 程序日志和配置（log, config, tmp_cache, service...）"
echo "  program/   - 程序本体（文件清单 + md5 + 关键脚本）"
