"""识别结果合并工具。

职责概览：
- 合并 time_stamps 中相邻且同 speaker(`rl`) 的片段。
- 在保留时序的同时减少碎片化结果，提升前端展示与后处理稳定性。
"""

from typing import Dict, List


def merge_adjacent_same_speaker(time_stamps: List[Dict]) -> List[Dict]:
    """Merge adjacent segments when speaker id (`rl`) is the same."""
    # 仅合并“相邻且 rl 相同”的片段，不跨越中间其他说话人。
    if not time_stamps:
        return []

    merged: List[Dict] = []
    for item in time_stamps:
        current = dict(item)
        if not merged:
            merged.append(current)
            continue

        prev = merged[-1]
        if prev.get("rl") == current.get("rl"):
            # 合并规则：时间取并集、文本直接拼接、sim 取较高值、sentence_end 取 OR。
            try:
                prev_start = float(prev.get("start", 0.0) or 0.0)
                prev_end = float(prev.get("end", prev_start) or prev_start)
            except Exception:
                prev_start = 0.0
                prev_end = 0.0
            try:
                cur_start = float(current.get("start", 0.0) or 0.0)
                cur_end = float(current.get("end", cur_start) or cur_start)
            except Exception:
                cur_start = 0.0
                cur_end = 0.0

            prev["start"] = round(min(prev_start, cur_start), 3)
            prev["end"] = round(max(prev_end, cur_end), 3)
            prev["text"] = (prev.get("text", "") or "") + (current.get("text", "") or "")

            a = prev.get("sim")
            b = current.get("sim")
            if a is None and b is None:
                prev["sim"] = None
            elif a is None:
                prev["sim"] = b
            elif b is None:
                prev["sim"] = a
            else:
                try:
                    prev["sim"] = round(max(float(a), float(b)), 3)
                except Exception:
                    prev["sim"] = a

            prev["sentence_end"] = bool(prev.get("sentence_end")) or bool(current.get("sentence_end"))
        else:
            merged.append(current)

    return merged
