# -*- coding: utf-8 -*-
"""CI RetryCommand 重试上一条用户消息（Phase 8 Tier 2）

借鉴 zhikuncode RetryCommand.java（48 行）：
- /retry 命令把上一条 user 消息重新注入会话
- 支持 string 和 list[dict] 两种 content 格式
- 返回特殊标记 "injected"，由主循环将其作为新的 prompt

集成点：main.py handle_slash_command 注册 /retry。
"""
from typing import Any, Dict, List, Optional


def find_last_user_message(messages: List[Dict[str, Any]]) -> Optional[Dict[str, Any]]:
    """倒序查找最后一条 user 消息。

    Args:
        messages: 会话消息列表

    Returns:
        最后一条 role=user 的消息，无则 None
    """
    if not messages:
        return None
    for msg in reversed(messages):
        if not isinstance(msg, dict):
            continue
        if msg.get("role") == "user":
            return msg
    return None


def extract_user_text(message: Dict[str, Any]) -> str:
    """从 user 消息中提取文本内容。

    支持两种 content 格式：
    - string: 直接返回
    - list[dict]: 合并所有 type=text 的 block 的 text 字段

    Args:
        message: user 消息 dict

    Returns:
        提取的文本，无文本时返回空字符串
    """
    if not isinstance(message, dict):
        return ""
    content = message.get("content")
    if content is None:
        return ""
    if isinstance(content, str):
        return content
    if isinstance(content, list):
        parts: List[str] = []
        for block in content:
            if isinstance(block, dict) and block.get("type") == "text":
                text = block.get("text", "")
                if text:
                    parts.append(text)
        return "".join(parts)
    # 其他类型转字符串
    return str(content)


def handle_retry(session) -> str:
    """/retry 命令处理：重试上一条 user 消息。

    Args:
        session: Session 实例，需有 messages 和 add_user 方法

    Returns:
        "injected" — 已找到并注入，主循环将其作为新 prompt
        False — 无 user 消息，未注入
    """
    last_user = find_last_user_message(session.messages)
    if last_user is None:
        return False
    text = extract_user_text(last_user)
    if not text:
        return False
    session.add_user(text)
    return "injected"
