#!/bin/bash

# 机器人端任务执行脚本
# 用于执行下发的任务并将结果上报到主控服务

set -e

# 配置
DEVICE_ID="${DEVICE_ID:-$(hostname)}"
MASTER_URL="${MASTER_URL:-http://yong.yogo.cloud:8086/}"
TASK_ID="${TASK_ID:-unknown}"

# 显示用法
usage() {
    echo "用法: $0 -t <task_id> -c <command> [-m <master_url>] [-d <device_id>]"
    echo ""
    echo "参数:"
    echo "  -t    任务ID (必填)"
    echo "  -c    要执行的命令 (必填)"
    echo "  -m    主控服务地址 (默认: http://yong.yogo.cloud:8086/)"
    echo "  -d    设备ID (默认: 主机名)"
    echo ""
    echo "示例:"
    echo "  $0 -t task-001 -c 'ls -la'"
    echo "  $0 -t task-002 -c 'apt update && apt install -y nginx' -m http://192.168.1.100:8080"
    exit 1
}

# 解析参数
while getopts "t:c:m:d:h" opt; do
    case $opt in
        t) TASK_ID="$OPTARG" ;;
        c) COMMAND="$OPTARG" ;;
        m) MASTER_URL="$OPTARG" ;;
        d) DEVICE_ID="$OPTARG" ;;
        h) usage ;;
        *) usage ;;
    esac
done

if [ -z "$COMMAND" ]; then
    COMMAND=$(curl -s -L "${MASTER_URL}/api/getbatch/${TASK_ID}" || echo "")
fi

# 验证必填参数
if [ -z "$TASK_ID" ] || [ -z "$COMMAND" ]; then
    echo "错误: 任务ID和命令为必填项"
    usage
fi

echo "================V4========================"
echo "设备ID: $DEVICE_ID"
echo "任务ID: $TASK_ID"
echo "主控地址: $MASTER_URL"
echo "执行命令: $COMMAND"
echo "========================================"

# 创建临时文件存储输出
OUTPUT_FILE=$(mktemp)
ERROR_FILE=$(mktemp)

# 执行命令并捕获输出和错误
START_TIME=$(date +%s)

if eval "$COMMAND" > "$OUTPUT_FILE" 2> "$ERROR_FILE"; then
    STATUS="success"
    echo "命令执行成功"
else
    ECODE=$?
    STATUS="failed($ECODE)"
    echo "命令执行失败，退出码: $ECODE"
fi

END_TIME=$(date +%s)
DURATION=$((END_TIME - START_TIME))

# 读取输出
OUTPUT=$(cat "$OUTPUT_FILE" | sed 's/"/\\"/g' | tr '\n' ' ')
ERROR=$(cat "$ERROR_FILE" | sed 's/"/\\"/g' | tr '\n' ' ')

# 清理临时文件
rm -f "$OUTPUT_FILE" "$ERROR_FILE"

# 构建JSON数据
# 规范化主控 URL 并使用 python3 生成 JSON（确保正确转义）
POST_URL="${MASTER_URL%/}/api/result"

# If python3 is available, use it to produce valid JSON safely.
if command -v python3 >/dev/null 2>&1; then
    JSON_DATA=$(python3 - <<PY
import json
try:
    duration = int('''${DURATION}''')
except:
    duration = 0
data = {
    "device_id": '''${DEVICE_ID}''',
    "task_id": '''${TASK_ID}''',
    "status": '''${STATUS}''',
    "output": '''${OUTPUT}''',
    "error": '''${ERROR}''',
    "duration": duration
}
print(json.dumps(data, ensure_ascii=False))
PY
    )
else
    # Fallback: basic escaping and compact JSON
    ESC_OUTPUT=$(printf '%s' "$OUTPUT" | sed 's/"/\\"/g' | tr '\n' ' ')
    ESC_ERROR=$(printf '%s' "$ERROR" | sed 's/"/\\"/g' | tr '\n' ' ')
    JSON_DATA=$(printf '{"device_id":"%s","task_id":"%s","status":"%s","output":"%s","error":"%s","duration":%s}' \
        "$DEVICE_ID" "$TASK_ID" "$STATUS" "$ESC_OUTPUT" "$ESC_ERROR" "$DURATION")
fi

echo ""
echo "上报结果到主控服务..."
echo "JSON数据: $JSON_DATA"

# 上报结果到主控服务
RESPONSE=$(curl -s -L -w "\nHTTP_CODE:%{http_code}" -X POST \
    -H "Content-Type: application/json" \
    --data-binary "$JSON_DATA" \
    "$POST_URL" 2>&1 || echo "CURL_FAILED")

HTTP_CODE=$(echo "$RESPONSE" | grep "HTTP_CODE:" | cut -d: -f2)
BODY=$(echo "$RESPONSE" | grep -v "HTTP_CODE:")

if [ "$HTTP_CODE" = "200" ]; then
    echo "结果上报成功: $BODY"
else
    echo "结果上报失败: HTTP $HTTP_CODE"
    echo "响应: $BODY"
    exit 1
fi

echo ""
echo "任务执行完成"

# scp scripts/robot_task.sh root@yong.yogo.cloud:~/web/bat/robot_task.sh