"""
交易部 — 统帅部集成钩子

将此模块导入 my_trader.py 即可将交易部接入统帅部网关。

用法：
  from exchange.gateway_hooks import attach_gateway
  gateway = attach_gateway(manager, gateway_url, token)

  # 在主循环中周期调用
  gateway.send_trading_status(equity, pnl, positions, score)
"""
import logging
from exchange.gateway_client import TradingGatewayClient, StrategyCommand, RiskCommand, InfrastructureCommand

logger = logging.getLogger("trading.gateway_hooks")

# 全局引用
_gateway: TradingGatewayClient = None


def attach_gateway(manager, gateway_url: str = "http://127.0.0.1:8000",
                   internal_token: str = "supreme-internal-token-2026",
                   poll_interval: float = 5.0) -> TradingGatewayClient:
    """将网关客户端挂载到 TradeManager 上"""
    global _gateway
    _gateway = TradingGatewayClient(
        gateway_url=gateway_url,
        internal_token=internal_token,
        poll_interval=poll_interval,
    )

    # ── 注册回调 ──

    def on_strategy_signal(cmd: StrategyCommand):
        """收到战略部交易命令 → 调整仓位"""
        logger.info(f"🎯 战略部信号: {cmd.asset} {cmd.direction} conviction={cmd.conviction}")

        if cmd.should_adjust_position():
            max_ratio = cmd.get_max_position_ratio()
            # 通过 manager 调整仓位上限
            if hasattr(manager, 'max_position_ratio'):
                manager.max_position_ratio = max_ratio
                logger.info(f"仓位上限调整为: {max_ratio*100:.0f}%")

    def on_risk_alert(cmd: RiskCommand):
        """收到风控告警 → 强制平仓/暂停"""
        logger.warning(f"🚨 风控告警: [{cmd.severity}] {cmd.rule}")

        if cmd.should_force_close():
            logger.critical(f"高危告警触发强制平仓! {cmd.rule} @ {cmd.address}")

            # 暂停新开仓
            if hasattr(manager, 'paused'):
                manager.paused = True

            # 如果告警涉及当前持仓标的，强制平仓
            asset = cmd.details.get('asset', 'ETH')
            if hasattr(manager, '_close_all_for_asset'):
                manager._close_all_for_asset(asset)

    def on_infra_command(cmd: InfrastructureCommand):
        """收到基础设施指令"""
        logger.warning(f"⚠️ 基础设施指令: {cmd.action}")

        if cmd.action == "pause":
            if hasattr(manager, 'paused'):
                manager.paused = True
        elif cmd.action == "resume":
            if hasattr(manager, 'paused'):
                manager.paused = False
        elif cmd.action == "shutdown":
            if hasattr(manager, 'shutdown'):
                manager.shutdown = True

    _gateway.on_strategy_signal = on_strategy_signal
    _gateway.on_risk_alert = on_risk_alert
    _gateway.on_infra_command = on_infra_command

    # 启动轮询
    _gateway.start_polling()

    # 挂载到 manager
    manager.gateway_client = _gateway
    manager.paused = False
    manager.shutdown = False

    logger.info("✅ 交易部已连接统帅部网关")
    return _gateway


def get_gateway() -> TradingGatewayClient:
    return _gateway


def gateway_send_status(equity: float, pnl_24h: float, positions: list,
                        score: float, strategy_name: str = "alpha"):
    """便捷方法：发送交易状态到网关"""
    if _gateway:
        return _gateway.send_trading_status(equity, pnl_24h, positions, score, strategy_name)
    return {"error": "gateway_not_attached"}


def gateway_send_pnl(pnl: float, pnl_pct: float, strategy_name: str = "alpha"):
    """便捷方法：发送盈亏更新"""
    if _gateway:
        return _gateway.send_pnl_update(pnl, pnl_pct, strategy_name)
    return {"error": "gateway_not_attached"}


def gateway_alert_strategy(alert_type: str, symbol: str, severity: str,
                           detail: str, metrics: dict = None) -> dict:
    """通知战略部：价格异动 / 异常事件，需调查原因并记录"""
    if not _gateway:
        return {"error": "gateway_not_attached"}
    payload = {
        "source_dept": "trading",
        "type": alert_type,
        "symbol": symbol,
        "severity": severity,
        "detail": detail,
        "metrics": metrics or {},
        "data_sources": ["okx_rest", "okx_ws", "computed"],
        "action_required": "investigate_and_log",
        "investigation_checklist": [
            "检查OKX是否有大额市价单",
            "检查Binance/Bybit同品种是否同步异动",
            "检查新闻源是否有相关消息",
            "检查链上是否有大额转账",
            "记录异动前后5分钟的orderbook变化",
        ],
        "timestamp": __import__('time').time(),
    }
    return _gateway._post("/api/strategy/price-anomaly", payload)
