#!/bin/bash

CURR_DIR=$(dirname "$(readlink -f "$0")")
echo "CURR_DIR: ${CURR_DIR}"
# 设置默认可执行文件路径
EXECUTABLE_PATH_DEFAULT="${CURR_DIR}/robot_console"
# 检查文件是否存在，若存在则添加可执行权限
if [ -f "$EXECUTABLE_PATH_DEFAULT" ]; then
    chmod +x "$EXECUTABLE_PATH_DEFAULT"
    echo "已为 $EXECUTABLE_PATH_DEFAULT 添加可执行权限。"
else
    echo "文件 $EXECUTABLE_PATH_DEFAULT 不存在，无法添加可执行权限。"
fi

SCRIPTS_DIR_DEFAULT="/opt/sysb/scripts"
echo "SCRIPTS_DIR_DEFAULT: ${SCRIPTS_DIR_DEFAULT}"
# 服务名称
SERVICE_NAME="robot_console"
# 老版本的服务名称与当前版本的服务名称不同，需要在清理旧服务时，同时清理旧版本的服务
OLDER_SERVICE_NAME="rms_client_config_tool"

# 可执行文件路径# 使用默认值
EXECUTABLE_PATH=${1:-${EXECUTABLE_PATH_DEFAULT}}
# 新的可执行文件路径（用于重启到新版本）
NEW_EXECUTABLE_PATH=${2:-}
# robot deployment scripts文件夹绝对路径 # 使用默认值
SCRIPTS_DIR=${3:-${SCRIPTS_DIR_DEFAULT}}
# 配置工具IP（可选）
IP=${4:-0.0.0.0}  # 使用默认值 0.0.0.0
# 配置工具端口号（可选）
PORT=${5:-5000}   # 使用默认值 5000
# ros_flaskIP （可选）
ROS_FLASK_IP=${6:-0.0.0.0}
#  ros_flaskPORT （可选）
ROS_FLASK_PORT=${7:-5050}

echo "用法: $0 [可执行文件路径] [新的可执行文件路径(可选)] [robot deployment scripts文件夹绝对路径] [IP] [PORT] [ROS_FLASK_IP] [ROS_FLASK_PORT]"
echo "默认值：可执行文件路径:${EXECUTABLE_PATH_DEFAULT}, robot deployment scripts文件夹绝对路径:${SCRIPTS_DIR_DEFAULT}, IP: 0.0.0.0, PORT: 5000, ROS_FLASK_IP: 0.0.0.0, ROS_FLASK_PORT: 5050"
   

# 检查 SCRIPTS_DIR 是否存在
if [ ! -d "$SCRIPTS_DIR" ]; then
    echo "错误: 路径 $SCRIPTS_DIR 不存在或不是目录。"
    exit 1
fi

# 服务启动脚本路径（用于 SysV init）
SERVICE_SCRIPT_PATH="/etc/init.d/${SERVICE_NAME}"
# 服务配置文件路径（用于 systemd）
SYSTEMD_SERVICE_FILE="/etc/systemd/system/${SERVICE_NAME}.service"
# 如果提供了新的可执行文件路径，则使用它
if [ -n "${NEW_EXECUTABLE_PATH}" ]; then
    FINAL_EXECUTABLE_PATH="${NEW_EXECUTABLE_PATH}"
else
    FINAL_EXECUTABLE_PATH="${EXECUTABLE_PATH}"
fi

ROBOT_CONSOLE_DIR=$(dirname "${FINAL_EXECUTABLE_PATH}")
echo "ROBOT_CONSOLE_DIR:${ROBOT_CONSOLE_DIR}"
ROBOT_CONSOLE_LOG_PATH="${ROBOT_CONSOLE_DIR}/logs/info.log"
echo "ROBOT_CONSOLE_LOG_PATH:${ROBOT_CONSOLE_LOG_PATH}"

# 创建日志文件所在的目录（如果不存在）
mkdir -p "$(dirname "${ROBOT_CONSOLE_LOG_PATH}")"
touch "${ROBOT_CONSOLE_LOG_PATH}"

# 检查系统使用的初始化系统
INIT_SYSTEM=$(ps --no-headers -o comm 1)

# 函数：创建 SysV init 服务
create_sysv_init_service() {
    echo "正在创建 SysV init 服务..."

    # 创建服务启动脚本
    cat > ${SERVICE_SCRIPT_PATH} << EOF
#!/bin/bash
### BEGIN INIT INFO
# Provides:          ${SERVICE_NAME}
# Required-Start:    \$network \$remote_fs \$syslog
# Required-Stop:     \$network \$remote_fs \$syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start daemon at boot time
# Description:       Enable service provided by daemon.
### END INIT INFO

case "\$1" in
   start)
        echo "Starting \${SERVICE_NAME}..."
        export SCRIPTS_DIR=${SCRIPTS_DIR}
        export ROBOT_CONSOLE_IP=${IP}
        export ROBOT_CONSOLE_PORT=${PORT}
        export ROS_FLASK_IP=${ROS_FLASK_IP}
        export ROS_FLASK_PORT=${ROS_FLASK_PORT}
        (${FINAL_EXECUTABLE_PATH} --script_dir=\$SCRIPTS_DIR --ip=\$ROBOT_CONSOLE_IP --port=\$ROBOT_CONSOLE_PORT --ros_flask_ip=\$ROS_FLASK_IP --ros_flask_port=\$ROS_FLASK_PORT >> ${ROBOT_CONSOLE_LOG_PATH} 2>&1) &
        ;;
   stop)
        echo "Stopping \${SERVICE_NAME}..."
        killall -9 ${SERVICE_NAME}
        ;;
   *)
        echo "Usage: \${SERVICE_NAME} {start|stop}"
        exit 1
        ;;
esac
EOF

    # 使服务启动脚本可执行
    chmod +x ${SERVICE_SCRIPT_PATH}

    # 添加服务到 chkconfig
    if ! which chkconfig &> /dev/null; then
        echo "chkconfig 未安装，无法添加服务到开机自启。"
    else
        if ! chkconfig --list | grep -q ${SERVICE_NAME}; then
            chkconfig --add ${SERVICE_NAME}
            echo "服务 ${SERVICE_NAME} 已添加到 chkconfig。"
        else
            echo "服务 ${SERVICE_NAME} 已存在，跳过添加步骤。"
        fi
    fi
}

# 函数：创建 systemd 服务
create_systemd_service() {
    echo "正在创建 systemd 服务..."

    # 创建服务文件
    cat > ${SYSTEMD_SERVICE_FILE} << EOF
[Unit]
Description=Robot Console Service
# 开机时等待网络连接成功后再启动，这对于需要使用网络的服务至关重要
After=network-online.target
Wants=network-online.target

[Service]
# 为服务设置环境变量，增加引号以兼容可能包含空格的路径
Environment="SCRIPTS_DIR=${SCRIPTS_DIR}"
Environment="ROBOT_CONSOLE_IP=${IP}"
Environment="ROBOT_CONSOLE_PORT=${PORT}"
Environment="ROS_FLASK_IP=${ROS_FLASK_IP}"
Environment="ROS_FLASK_PORT=${ROS_FLASK_PORT}"
# 设置工作目录为可执行文件所在的目录，以确保相对路径的资源能被正确找到
WorkingDirectory=${ROBOT_CONSOLE_DIR}
# 简化启动命令，并为参数增加引号以提高稳健性
ExecStart=${FINAL_EXECUTABLE_PATH} --script_dir="${SCRIPTS_DIR}" --ip="${IP}" --port="${PORT}" --ros_flask_ip="${ROS_FLASK_IP}" --ros_flask_port="${ROS_FLASK_PORT}"
Restart=on-failure
Type=simple
StandardOutput=file:${ROBOT_CONSOLE_LOG_PATH}
StandardError=file:${ROBOT_CONSOLE_LOG_PATH}

[Install]
WantedBy=multi-user.target
EOF

    # 使服务文件可执行
    chmod 644 ${SYSTEMD_SERVICE_FILE}

    # 重新加载 systemd 配置
    systemctl daemon-reload

    # 启用服务
    systemctl enable ${SERVICE_NAME}

    echo "服务 ${SERVICE_NAME} 创建并启用。"
}

# 函数：彻底清理服务
clean_service() {
    echo "正在彻底清理服务 ${SERVICE_NAME}..."

    # 停止并禁用 systemd 服务
    if [ "$INIT_SYSTEM" == "systemd" ]; then
        echo "检测到 systemd, 开始清理..."
        systemctl stop ${SERVICE_NAME} >/dev/null 2>&1
        systemctl disable ${SERVICE_NAME} >/dev/null 2>&1
        systemctl stop ${OLDER_SERVICE_NAME} >/dev/null 2>&1
        systemctl disable ${OLDER_SERVICE_NAME} >/dev/null 2>&1
        if [ -f "${SYSTEMD_SERVICE_FILE}" ]; then
            echo "正在删除 systemd 服务文件: ${SYSTEMD_SERVICE_FILE}"
            rm -f "${SYSTEMD_SERVICE_FILE}"
        fi
        systemctl daemon-reload
        systemctl reset-failed
        echo "systemd 服务清理完成。"
    # 停止并禁用 SysV init 服务
    else
        echo "检测到 SysV init, 开始清理..."
        service ${SERVICE_NAME} stop >/dev/null 2>&1
        service ${OLDER_SERVICE_NAME} stop >/dev/null 2>&1
        if which chkconfig &> /dev/null; then
            chkconfig --del ${SERVICE_NAME}
            chkconfig --del ${OLDER_SERVICE_NAME}
        elif which update-rc.d &> /dev/null; then
            update-rc.d -f ${SERVICE_NAME} remove
            update-rc.d -f ${OLDER_SERVICE_NAME} remove
        fi
        if [ -f "${SERVICE_SCRIPT_PATH}" ]; then
            echo "正在删除 SysV init 脚本: ${SERVICE_SCRIPT_PATH}"
            rm -f "${SERVICE_SCRIPT_PATH}"
        fi
        echo "SysV init 服务清理完成。"
    fi
}

# 函数：重启服务并检查是否成功
restart_service() {
    if [ "$INIT_SYSTEM" == "systemd" ]; then
        echo "正在使用 systemd 重启服务 ${SERVICE_NAME}..."
        systemctl restart ${SERVICE_NAME}
        # 检查服务是否成功启动
        sleep 2  # 等待一段时间让服务启动
        echo "restart指令已运行2s 服务状态： $(systemctl is-active ${SERVICE_NAME})"
        sleep 2
        echo "restart指令已运行4s 服务状态： $(systemctl is-active ${SERVICE_NAME})"
        sleep 2  # 等待一段时间让服务启动
        echo "restart指令已运行6s 服务状态： $(systemctl is-active ${SERVICE_NAME})"
        sleep 2  # 等待一段时间让服务启动
        echo "restart指令已运行8s 服务状态： $(systemctl is-active ${SERVICE_NAME})"

        if [ "$(systemctl is-active ${SERVICE_NAME})" == "active" ]; then
            echo "${SERVICE_NAME} 服务已成功启动。"
        else
            echo "${SERVICE_NAME} 服务启动失败。当前状态: $(systemctl is-active ${SERVICE_NAME})"
            echo "更多信息请查看日志: journalctl -u ${SERVICE_NAME} 或 ${ROBOT_CONSOLE_LOG_PATH}"
        fi
    else
        echo "正在使用 SysV init 重启服务 ${SERVICE_NAME}..."
        service ${SERVICE_NAME} restart
        # 检查服务是否成功启动
        sleep 2  # 等待一段时间让服务启动
        echo "restart指令已运行2s 服务状态$(service ${SERVICE_NAME} status)"
        sleep 2  # 等待一段时间让服务启动
        echo "restart指令已运行4s 服务状态$(service ${SERVICE_NAME} status)"
        sleep 2  # 等待一段时间让服务启动
        echo "restart指令已运行6s 服务状态$(service ${SERVICE_NAME} status)"
        sleep 2  # 等待一段时间让服务启动
        echo "restart指令已运行8s 服务状态$(service ${SERVICE_NAME} status)"
        # 检查服务状态
        service_status=$(service ${SERVICE_NAME} status)
        if echo "$service_status" | grep -q "stopped" || echo "$service_status" | grep -q "failed"; then
            echo "服务 ${SERVICE_NAME} 启动失败。"
        else
            echo "服务 ${SERVICE_NAME} 已成功启动。"
        fi
    fi
}

# 主逻辑：安装或更新服务
# 检查是否为重启模式（即是否提供了新路径）
RESTART_MODE=false
if [ -n "${NEW_EXECUTABLE_PATH}" ]; then
    RESTART_MODE=true
    echo "检测到新可执行文件路径，进入重启/更新模式。"
fi

# 如果不是重启模式，则清理旧服务
if [ "$RESTART_MODE" = false ]; then
    echo "首次安装模式，正在清理任何可能存在的旧服务..."
    clean_service
fi

# 接着，根据初始化系统创建或更新服务。
if [ "$INIT_SYSTEM" == "systemd" ]; then
    echo "检测到系统使用 systemd 初始化系统，正在创建/更新服务..."
    create_systemd_service
else
    echo "检测到系统使用 SysV init 初始化系统，正在创建服务..."
    
    # 检查必要的命令是否存在
    if ! which service &> /dev/null || ! which chkconfig &> /dev/null; then
        echo "当前系统不支持 SysV init 服务管理工具，无法安装服务。"
        exit 1
    fi
    create_sysv_init_service
fi

# 3. 最后，启动新创建的服务。
echo "正在启动服务..."
restart_service