import re
import os
import logging
from typing import Optional

logger = logging.getLogger("uvicorn.error")

def get_critical_keywords() -> list[str]:
    default_kw = ["탈선", "화재", "사상", "구호", "단전", "충돌"]
    # project_root/data/critical_keywords.txt
    base_dir = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
    txt_path = os.path.join(base_dir, "data", "critical_keywords.txt")
    
    try:
        if os.path.exists(txt_path):
            with open(txt_path, "r", encoding="utf-8") as f:
                lines = [line.strip() for line in f if line.strip()]
                if lines:
                    return lines
    except Exception as e:
        logger.warning(f"[Analyzer] 긴급 키워드 파일 읽기 실패, 기본값 사용: {e}")
    
    return default_kw

CRITICAL_KEYWORDS = get_critical_keywords()

def check_urgency(text: str) -> str:
    """텍스트 내 긴급 키워드가 포함되어 있는지 확인합니다."""
    for kw in CRITICAL_KEYWORDS:
        if kw in text:
            return "긴급"
    return "일반"

KOR_NUM_MAP: dict[str, str] = {
    "영": "0", "공": "0", 
    "일": "1", "이": "2", "삼": "3", "사": "4", "오": "5", 
    "육": "6", "칠": "7", "팔": "8", "구": "9"
}

def extract_train_number(text: str) -> Optional[str]:
    """
    STT 텍스트에서 열차 번호("K1234", "3042", "삼공사이", "삼천사십이")를 추출합니다.
    """
    # 1. 일반 영어+숫자 조합 (K1234, 1234 등)
    m1 = re.search(r'([Kk케이]?\s*\d{3,4})', text)
    if m1:
        num_str = m1.group(1).replace(" ", "").replace("케이", "K").upper()
        if num_str.startswith("K") or len(num_str) >= 3:
            return num_str

    # 2. 한글 숫자로 읽는 방식 매칭 ("삼공사이", "삼천사십이", "케이삼천사백")
    m2 = re.search(r'([Kk케이]?\s*[영공일이삼사오육칠팔구천백십]{2,10})', text)
    if m2:
        raw = m2.group(1).replace(" ", "").replace("케이", "K").upper()
        prefix = "K" if raw.startswith("K") else ""
        if prefix:
            raw = raw[1:]
            
        has_units = any(c in raw for c in ["천", "백", "십"])
        res = 0
        
        if not has_units:
            # "삼공사이" 방식
            digits = "".join(KOR_NUM_MAP.get(c, "") for c in raw)
            if len(digits) >= 3:
                return f"{prefix}{digits}"
        else:
            # "삼천사십이" 방식
            curr = 0
            for ch in raw:
                if ch in KOR_NUM_MAP:
                    curr = int(KOR_NUM_MAP[ch])
                elif ch == "천":
                    res += (curr if curr != 0 else 1) * 1000
                    curr = 0
                elif ch == "백":
                    res += (curr if curr != 0 else 1) * 100
                    curr = 0
                elif ch == "십":
                    res += (curr if curr != 0 else 1) * 10
                    curr = 0
            res += curr
            if res >= 100:  # 최소 3자리의 숫자값 보장
                return f"{prefix}{res}"
                
    return None
