#!/bin/bash

# 跨平台 Lingma 调试脚本 - 支持 macOS 和 Linux
# 该脚本功能与 windows_lingma_cn.bat 相同，但适配 Unix 系统

# 设置脚本选项
set -euo pipefail  # 错误时退出，检测未定义变量，检测管道错误

# 输出脚本运行信息
echo "正在运行 Lingma 调试脚本..."
echo "操作系统: $(uname -s)"

# 设置 Lingma 的目录和可执行文件路径
LINGMA_DIR="$HOME/.lingma"
LINGMA_EXE="Lingma"
BIN_DIR="$LINGMA_DIR/bin"
LOG_DIR="$LINGMA_DIR/logs"

# 根据操作系统和CPU架构确定架构目录
ARCH=""
MACHINE_ARCH="$(uname -m)"
case "$(uname -s)" in
    Darwin*)
        if [ "$MACHINE_ARCH" = "arm64" ]; then
            ARCH="aarch64_darwin"
        else
            ARCH="x86_64_darwin"
        fi
        ;;
    Linux*)
        if [ "$MACHINE_ARCH" = "aarch64" ] || [ "$MACHINE_ARCH" = "arm64" ]; then
            ARCH="aarch64_linux"
        else
            ARCH="x86_64_linux"
        fi
        ;;
    *)
        echo "错误：不支持的操作系统 $(uname -s)"
        exit 1
        ;;
esac

# 查找bin目录下版本号最高的子目录
echo "查找目录: $BIN_DIR"
LATEST_VERSION_DIR=$(find "$BIN_DIR" -mindepth 1 -maxdepth 1 -type d -exec basename {} \; 2>/dev/null | sort -V | tail -n 1)

if [ -n "${LATEST_VERSION_DIR:-}" ]; then
    LINGMA_EXE_DIR="$BIN_DIR/$LATEST_VERSION_DIR/$ARCH"
else
    echo "错误：找不到版本目录"
    exit 1
fi

echo "最新目录: $LINGMA_EXE_DIR"

# 验证可执行文件存在
if [ ! -f "$LINGMA_EXE_DIR/$LINGMA_EXE" ] || [ ! -x "$LINGMA_EXE_DIR/$LINGMA_EXE" ]; then
    echo "错误：Lingma可执行文件不存在或不可执行！路径: $LINGMA_EXE_DIR/$LINGMA_EXE"
    exit 1
fi

# 设置日志文件路径
TIMESTAMP=$(date +"%Y-%m-%d_%H-%M-%S")
LOG_FILE="$(pwd)/Lingma_Log_$TIMESTAMP.txt"

# 写入信息介绍
{
    echo "Lingma 日志"
    echo "========================"
    echo "生成时间: $(date)"
    echo "操作系统: $(uname -s)"
    echo "架构: $ARCH"
    echo ""
} > "$LOG_FILE"

# 记录网络连接状态和测试请求
{
    echo "[网络连接测试]"
    
    # 测试主要API
    echo "请求1: GET https://lingma-api.tongyi.aliyun.com/algo/api/v1/ping"
    if command -v curl >/dev/null 2>&1; then
        curl -s --connect-timeout 10 https://lingma-api.tongyi.aliyun.com/algo/api/v1/ping
        echo ""
    else
        echo "curl 命令不可用"
    fi
    
    # 测试其他服务
    echo ""
    echo "请求2: HEAD https://devops.aliyun.com"
    if command -v curl >/dev/null 2>&1; then
        curl -s -I --connect-timeout 10 https://devops.aliyun.com
        echo ""
    else
        echo "curl 命令不可用"
    fi
    
    # 如果curl不可用，尝试wget
    if command -v wget >/dev/null 2>&1; then
        echo ""
        echo "使用 wget 测试连接..."
        wget --timeout=10 --spider https://lingma-api.tongyi.aliyun.com/algo/api/v1/ping 2>&1 || echo "wget 测试失败"
    fi
    echo ""
} >> "$LOG_FILE"

# 获取目录结构并写入日志
{
    echo "[Lingma 目录结构]"
    if command -v tree >/dev/null 2>&1; then
        tree -a "$LINGMA_DIR" 2>/dev/null || find "$LINGMA_DIR" -print | sed 's;[^/]*/;|____;g;s;____|; |;g'
    else
        find "$LINGMA_DIR" -type f -o -type d | sed 's;[^/]*/;|____;g;s;____|; |;g'
    fi
    echo ""
} >> "$LOG_FILE"

# 检查配置文件
{
    echo "[配置文件检查]"
    if [ -f "$BIN_DIR/config.json" ]; then
        echo "config.json: 存在"
        echo "  大小: $(du -h "$BIN_DIR/config.json" 2>/dev/null | cut -f1)"
    else
        echo "config.json: 不存在"
    fi
    
    if [ -f "$BIN_DIR/env.json" ]; then
        echo "env.json: 存在"
        echo "  大小: $(du -h "$BIN_DIR/env.json" 2>/dev/null | cut -f1)"
    else
        echo "env.json: 不存在"
    fi
    echo ""
} >> "$LOG_FILE"

# 获取操作系统和硬件信息并写入日志
{
    echo "[系统信息]"
    echo "操作系统版本:"
    uname -a
    echo ""
    
    echo "CPU 信息:"
    if [ "$(uname -s)" = "Darwin" ]; then
        sysctl -n machdep.cpu.brand_string 2>/dev/null || echo "无法获取CPU信息"
    else
        cat /proc/cpuinfo 2>/dev/null | grep "model name" | head -n 1 || echo "无法获取CPU信息"
    fi
    echo ""
    
    echo "内存信息:"
    if [ "$(uname -s)" = "Darwin" ]; then
        sysctl hw.memsize 2>/dev/null || echo "无法获取内存信息"
    else
        free -h 2>/dev/null || cat /proc/meminfo 2>/dev/null | grep MemTotal
    fi
    echo ""
    
    echo "磁盘空间:"
    df -h "$HOME" 2>/dev/null || echo "无法获取磁盘空间信息"
    echo ""
} >> "$LOG_FILE"

# 获取lingma.log文件的最后80行
{
    echo "[Lingma 日志文件最后80行]"
    if [ -f "$LOG_DIR/lingma.log" ]; then
        tail -n 80 "$LOG_DIR/lingma.log" 2>/dev/null || echo "无法读取lingma.log文件"
    else
        echo "未找到lingma.log文件！"
    fi
    echo ""
} >> "$LOG_FILE"

# 记录version参数结果
{
    echo "[Lingma 版本信息]"
    if timeout 10s "$LINGMA_EXE_DIR/$LINGMA_EXE" version 2>&1; then
        echo "版本查询成功"
    else
        echo "版本查询超时或失败"
    fi
    echo ""
} >> "$LOG_FILE"

# 启动Lingma并记录结果
{
    echo "[启动 Lingma]"
    if timeout 30s "$LINGMA_EXE_DIR/$LINGMA_EXE" start 2>&1; then
        echo "启动命令完成"
    else
        echo "启动命令超时或失败"
    fi
    echo ""
} >> "$LOG_FILE"

# 检查.info文件
{
    echo "[.info 文件检查]"
    if [ -f "$LINGMA_DIR/.info" ]; then
        echo ".info 文件: 存在"
        if [ -s "$LINGMA_DIR/.info" ]; then
            echo "文件内容: 非空"
            cat "$LINGMA_DIR/.info" 2>/dev/null || echo "无法读取 .info 文件"
        else
            echo "文件内容: 为空"
        fi
    else
        echo ".info 文件: 不存在"
    fi
    echo ""
} >> "$LOG_FILE"

# 添加结束标记
{
    echo ""
    echo "==================================="
    echo "日志生成完成"
    echo "生成时间: $(date)"
    echo "==================================="
    echo ""
    echo "来自阿里云，有疑问请进钉钉群：53770000738"
} >> "$LOG_FILE"

echo "日志已保存至：$LOG_FILE"

# 尝试用默认编辑器打开日志文件
echo "尝试打开日志文件..."

if command -v open >/dev/null 2>&1 && [ "$(uname -s)" = "Darwin" ]; then
    # Mac
    open "$LOG_FILE"
    echo "已在默认应用中打开日志文件"
elif command -v xdg-open >/dev/null 2>&1 && [ "$(uname -s)" = "Linux" ]; then
    # Linux
    xdg-open "$LOG_FILE"
    echo "已在默认应用中打开日志文件"
elif command -v nano >/dev/null 2>&1; then
    # fallback to nano editor
    echo "使用 nano 打开日志文件 (按 Ctrl+X 退出)"
    sleep 2
    nano "$LOG_FILE"
elif command -v vim >/dev/null 2>&1; then
    # fallback to vim editor
    echo "使用 vim 打开日志文件 (按 :q 退出)"
    sleep 2
    vim "$LOG_FILE"
else
    echo "日志文件路径: $LOG_FILE"
    echo "请手动打开日志文件查看内容"
fi