"""说话人 ID 解析与预加载服务。

职责概览：
- 统一解析多种 speakerIds 输入形态（list/tuple/JSON 字符串/逗号分隔字符串）。
- 将持久化 speaker embedding 预加载到当前会话的 SpeakerRegistry。
"""

import json
from typing import List, Optional

from ..utils.speaker_id import SpeakerRegistry


def parse_speaker_ids(raw: Optional[object]) -> List[str]:
    # 统一兼容 list/tuple/JSON 字符串/逗号分隔字符串。
    if raw is None:
        return []

    if isinstance(raw, list):
        return [str(v).strip() for v in raw if str(v).strip()]

    if isinstance(raw, tuple):
        return [str(v).strip() for v in list(raw) if str(v).strip()]

    if isinstance(raw, str):
        text = raw.strip()
        if not text:
            return []

        try:
            parsed = json.loads(text)
            if isinstance(parsed, list):
                return [str(v).strip() for v in parsed if str(v).strip()]
        except Exception:
            pass

        return [s.strip() for s in text.split(",") if s.strip()]

    return []


def preload_persisted_speakers(registry: SpeakerRegistry, raw_speaker_ids: Optional[object]) -> List[str]:
    # 预加载持久化说话人 embedding 到当前会话 registry，失败时返回空列表。
    ids = parse_speaker_ids(raw_speaker_ids)
    if not ids:
        return []
    try:
        return registry.load_persisted_bulk(list(ids))
    except Exception:
        return []
