# coding: utf-8
"""
服务端数据类模块

定义服务端使用的数据类，包括任务（Task）和结果（Result）。
使用 dataclass 提供类型安全和清晰的数据结构。
"""

from dataclasses import dataclass, field
from typing import List, Optional


@dataclass
class Task:
    """
    语音识别任务

    封装发送到识别进程的任务数据，包含音频数据和元信息。

    Attributes:
        type: 任务类型 ('mic' 麦克风, 'file' 文件, 'cmd' 命令)
        data: 原始音频数据 (float32, 16kHz, mono)
        offset: 当前片段在整段音频中的时间偏移（秒）
        overlap: 片段重叠时间（秒），用于去重
        task_id: 任务唯一标识
        socket_id: WebSocket 连接标识
        is_final: 是否为音频流的最后一个片段
        time_start: 录音/音频开始时间戳
        time_submit: 任务提交时间戳
        samplerate: 采样率，默认 16000 Hz
    """
    type: str
    data: bytes
    offset: float
    overlap: float
    task_id: str
    socket_id: str
    is_final: bool
    time_start: float
    time_submit: float
    context: str = ''
    language: str = 'auto'
    samplerate: int = 16000
    command: str = ''           # 特殊命令，如 'gpu_boost' / 'gpu_unboost'


@dataclass
class Result:
    """
    语音识别结果
    
    封装识别进程返回的结果数据。
    
    Attributes:
        task_id: 任务唯一标识
        socket_id: WebSocket 连接标识
        source: 音频来源 ('mic' 或 'file')
        duration: 已处理的音频总时长（秒）
        time_start: 录音/音频开始时间戳
        time_submit: 片段提交时间戳
        time_complete: 识别完成时间戳
        
        text: 主要输出 - 简单文本拼接（不依赖时间戳，用于语音输入）
        text_accu: 精确输出 - 时间戳去重拼接（用于字幕生成）
        tokens: 字级 token 列表（与 timestamps 对应）
        timestamps: 字级时间戳列表（秒）
        
        is_final: 是否已完成所有片段识别
    """
    task_id: str
    socket_id: str
    type: str

    duration: float = 0.0
    time_start: float = 0.0
    time_submit: float = 0.0
    time_complete: float = 0.0
    
    # 主要输出（简单文本拼接）
    text: str = ''
    
    # 精确输出（时间戳拼接）
    text_accu: str = ''
    tokens: List[str] = field(default_factory=list)
    timestamps: List[float] = field(default_factory=list)
    
    is_final: bool = False

@dataclass
class RecognitionSession:
    """
    识别会话
    
    封装单个 task_id 的所有中间识别状态。
    """
    task_id: str
    result: Result
    # 未来可在此扩展会话级状态，如 N-best 假设、中间特征缓存等
