#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
handle_control_request.py
生成设备控制指令的二次确认拦截字符串（调用 ups-control 技能生成 Modbus RTU 报文）。
"""
import argparse
import json
import subprocess
import sys

# 控制意图映射表：告警处置建议中的自然语言 → ups-control 技能的 --intent 参数
INTENT_MAP = {
    "紧急停机": "停机",
    "立即停机": "停机",
    "停机": "停机",
    "关机": "停机",
    "开机": "开机",
    "启动": "开机",
    "强制均充": "强制均充",
    "开启ECO模式": "开启ECO模式",
    "关闭ECO模式": "关闭ECO模式",
    "静音": "静音蜂鸣器",
    "静音蜂鸣器": "静音蜂鸣器",
    "开启蜂鸣器": "开启蜂鸣器",
    "标准电池测试": "标准电池测试",
    "深度电池测试": "深度电池测试",
    "取消电池测试": "取消电池测试",
    "设置CC充电模式": "设置CC充电模式",
    "设置CP充电模式": "设置CP充电模式",
}


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument("--device_id", required=True, help="设备ID")
    parser.add_argument("--command", required=True, help="控制意图，如：紧急停机、开机")
    parser.add_argument("--reason", default="告警处置建议触发", help="触发原因")
    parser.add_argument("--slave_id", type=int, default=1, help="Modbus 从站地址（默认 1）")
    args = parser.parse_args()

    # 映射到 ups-control 技能的标准意图
    if args.command not in INTENT_MAP:
        print(json.dumps({
            "status": "error",
            "message": f"不支持的控制意图: {args.command}，支持的命令: {list(INTENT_MAP.keys())}"
        }, ensure_ascii=False))
        sys.exit(1)

    intent = INTENT_MAP[args.command]

    # 调用 ups-control 技能的 build_modbus_command.py 生成 RTU 报文
    ups_control_script = "/home/admin/.openclaw/workspace-agent-200/skills/ups-control/scripts/build_modbus_command.py"
    
    try:
        result = subprocess.run(
            ["python3", ups_control_script, "--device_id", args.device_id, "--intent", intent, "--slave_id", str(args.slave_id)],
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE,
            timeout=5
        )
        result.stdout = result.stdout.decode('utf-8')
        result.stderr = result.stderr.decode('utf-8')
        
        if result.returncode != 0:
            print(json.dumps({
                "status": "error",
                "message": f"调用 ups-control 失败: {result.stderr}"
            }, ensure_ascii=False))
            sys.exit(1)
        
        # 输出 ups-control 返回的 &**&...&**& 字符串
        confirm_str = result.stdout.strip()
        
        # 追加触发原因到输出（供大模型理解上下文，但不影响拦截格式）
        print(confirm_str)
        print(f"\n触发原因: {args.reason}")
        
    except subprocess.TimeoutExpired:
        print(json.dumps({"status": "error", "message": "调用 ups-control 超时"}, ensure_ascii=False))
        sys.exit(1)
    except Exception as e:
        print(json.dumps({"status": "error", "message": f"调用 ups-control 异常: {e}"}, ensure_ascii=False))
        sys.exit(1)


if __name__ == "__main__":
    main()
