#!/bin/bash
################################################################################
# 通用函数库
# 说明: 提供可复用的工具函数，包括日志、Docker、系统信息、工具和数据处理
################################################################################

# 只在LIB_DIR未设置时才计算
if [ -z "$LIB_DIR" ]; then
    # 获取脚本所在目录
    SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
    LIB_DIR="$(dirname "$SCRIPT_DIR")"
fi

# 加载配置文件
if [ -f "$LIB_DIR/lib/config.sh" ]; then
    source "$LIB_DIR/lib/config.sh"
else
    echo "ERROR: 配置文件不存在: $LIB_DIR/lib/config.sh" >&2
    exit 1
fi

# ==================== 日志函数 ====================

# 输出信息日志
log_info() {
    echo "[INFO] $*"
}

# 输出错误日志
log_error() {
    echo "[ERROR] $*" >&2
}

# 输出警告日志
log_warn() {
    echo "[WARN] $*"
}

# 输出调试日志
log_debug() {
    if [ "$DEBUG" = "1" ]; then
        echo "[DEBUG] $*"
    fi
}

# ==================== Docker通用函数 ====================

# 检查容器是否运行
is_container_running() {
    local container=$1
    docker ps --format '{{.Names}}' 2>/dev/null | grep -q "^${container}$"
    return $?
}

# 获取容器IP
get_container_ip() {
    local container=$1
    docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' "$container" 2>/dev/null
}

# 在容器中执行命令
exec_in_container() {
    local container=$1
    shift
    local cmd="$@"

    if ! is_container_running "$container"; then
        log_error "容器 $container 未运行"
        return 1
    fi

    docker exec "$container" sh -c "$cmd" 2>/dev/null
}

# 获取容器状态
get_container_status() {
    local container=$1
    docker inspect --format='{{.State.Status}}' "$container" 2>/dev/null
}

# 获取容器运行时间
get_container_uptime() {
    local container=$1
    docker inspect --format='{{.State.StartedAt}}' "$container" 2>/dev/null | \
        awk -F'T' '{print $1}' | \
        xargs -I {} date -d {} +%s | \
        awk '{print systime()-$1}' | \
        awk '{print int($1/86400)}'
}

# ==================== 系统信息函数 ====================

# 获取系统运行时间（天数）
get_uptime_days() {
    cat /proc/uptime | awk '{print int($1/86400)}'
}

# 获取系统负载
get_loadavg() {
    cat /proc/loadavg | awk '{print $1, $2, $3}'
}

# 获取主机名
get_hostname() {
    hostname
}

# 获取操作系统版本
get_os_version() {
    if [ -f /etc/os-release ]; then
        . /etc/os-release
        echo "$PRETTY_NAME"
    elif [ -f /etc/redhat-release ]; then
        cat /etc/redhat-release
    elif [ -f /etc/lsb-release ]; then
        . /etc/lsb-release
        echo "$DISTRIB_DESCRIPTION"
    else
        uname -s
    fi
}

# 获取内核版本
get_kernel_version() {
    uname -r
}

# ==================== 工具函数 ====================

# 检查命令是否存在
require_command() {
    local cmd=$1
    if ! command -v "$cmd" &> /dev/null; then
        log_error "命令不存在: $cmd"
        return 1
    fi
    return 0
}

# 检查端口是否开放
check_port() {
    local port=$1
    local protocol=${2:-tcp}

    if [ "$protocol" = "tcp" ]; then
        netstat -tuln 2>/dev/null | grep -q ":$port " || ss -tuln 2>/dev/null | grep -q ":$port "
    else
        netstat -tuln 2>/dev/null | grep -q "\.$port " || ss -tuln 2>/dev/null | grep -q "\.$port "
    fi
    return $?
}

# 检查进程是否存在
check_process() {
    local pname=$1
    pgrep -x "$pname" > /dev/null 2>&1
    return $?
}

# 数字比较辅助函数
num_compare() {
    local val1=$1
    local op=$2
    local val2=$3

    awk "BEGIN {exit !($val1 $op $val2)}"
}

# ==================== 数据处理函数 ====================

# 格式化字节数
format_bytes() {
    local bytes=$1
    local units=("B" "KB" "MB" "GB" "TB")
    local unit=0

    while [ $(num_compare "$bytes" ">=" 1024 && echo $?) -eq 0 ] && [ $unit -lt 4 ]; do
        bytes=$(awk "BEGIN {printf \"%.2f\", $bytes/1024}")
        unit=$((unit + 1))
    done

    echo "${bytes}${units[$unit]}"
}

# 格式化百分比
format_percent() {
    local value=$1
    echo "${value}%"
}

# 计算百分比
calc_percent() {
    local used=$1
    local total=$2

    if [ "$total" -eq 0 ]; then
        echo "0"
        return
    fi

    awk "BEGIN {printf \"%.2f\", ($used/$total)*100}"
}

# 格式化数字（添加千位分隔符）
format_number() {
    local num=$1
    echo "$num" | awk '{printf "%'\''d\n", $0}'
}

# ==================== 输出函数 ====================

# 输出检测结果（标准格式）
output_result() {
    local key=$1
    local value=$2
    echo "${key}:${value}"
}

# 输出错误信息（标准格式）
output_error() {
    local msg=$1
    echo "ERROR:${msg}" >&2
}

# ==================== 验证函数 ====================

# 验证数字
validate_number() {
    local value=$1
    [[ "$value" =~ ^[0-9]+(\.[0-9]+)?$ ]]
}

# 验证IP地址
validate_ip() {
    local ip=$1
    [[ "$ip" =~ ^([0-9]{1,3}\.){3}[0-9]{1,3}$ ]]
}

# ==================== 文件操作函数 ====================

# 检查文件是否存在且可读
check_file_readable() {
    local file=$1
    if [ ! -f "$file" ]; then
        log_error "文件不存在: $file"
        return 1
    fi

    if [ ! -r "$file" ]; then
        log_error "文件不可读: $file"
        return 1
    fi

    return 0
}

# 获取文件最后修改时间（天数）
get_file_age_days() {
    local file=$1
    if [ ! -f "$file" ]; then
        echo "-1"
        return
    fi

    local mtime=$(stat -c %Y "$file" 2>/dev/null || stat -f %m "$file" 2>/dev/null)
    local current=$(date +%s)
    echo $(( (current - mtime) / 86400 ))
}

# ==================== 时间函数 ====================

# 获取当前时间戳
get_timestamp() {
    date +%s
}

# 格式化时间戳
format_timestamp() {
    local ts=$1
    local format=${2:-%Y-%m-%d %H:%M:%S}
    date -d "@$ts" +"$format" 2>/dev/null || date -r "$ts" +"$format" 2>/dev/null
}
