from pydantic import BaseModel, Field
from typing import Optional, List
from datetime import datetime

class STTSegment(BaseModel):
    """발화 단위(Segment) 상세 데이터 모델"""
    start_sec: float = Field(..., description="발화 시작 시간 (초)")
    end_sec: float = Field(..., description="발화 종료 시간 (초)")
    text: str = Field(..., description="교정이 완료된 텍스트")
    speaker: Optional[str] = Field(default=None, description="휴리스틱 발화자 식별 결과")
    absolute_start_time: Optional[str] = Field(default=None, description="ISO 8601 발화 시작 절대 시간")
    absolute_end_time: Optional[str] = Field(default=None, description="ISO 8601 발화 종료 절대 시간")
    audio_path: Optional[str] = Field(default=None, description="로컬 파일 경로 (Opus 변환본)")
    id: Optional[int] = Field(default=None, description="DB segment ID (저장 후 매핑됨)")

class STTRequest(BaseModel):
    """STT 처리를 요청하기 위한 데이터 모델"""
    audio_file_path: str = Field(..., description="변환할 .wav 등 오디오 파일의 절대/상대 경로")
    language: str = Field(default="ko", description="오디오의 주 언어 코드 (기본값: 한국어)")
    base_datetime: Optional[datetime] = Field(default=None, description="녹음 시작 절대 시간 (Line-In 동기화용)")

class STTResponse(BaseModel):
    """STT 처리 결과를 반환하기 위한 데이터 모델"""
    text: str = Field(..., description="변환이 완료된 전체 문자열 텍스트")
    language: str = Field(..., description="인식된/지정된 언어 코드")
    segments: List[STTSegment] = Field(default_factory=list, description="개별 발화 단위 데이터 리스트")
    processing_time_sec: Optional[float] = Field(default=None, description="STT 처리에 소요된 시간 (초)")
    
    # 벤치마킹 지표
    load_time_sec: Optional[float] = Field(default=None, description="모델 로드 시간 (초)")
    audio_duration_sec: Optional[float] = Field(default=None, description="원본 오디오 총 길이 (초)")
    peak_memory_mb: Optional[float] = Field(default=None, description="변환 중 발생한 최대 메모리 점유율 (MB)")
    process_speed_x: Optional[float] = Field(default=None, description="오디오 길이 대비 처리 속도 비율 (배수)")

    # 룰 기반 실시간 분석 결과
    urgency: Optional[str] = Field(default="일반", description="긴급도 판별 결과")
    train_number: Optional[str] = Field(default=None, description="추출된 열차 번호")
