"""
숫자 -> 한글 발음 변환 전처리기
TTS에 넣기 전에 모든 숫자를 한글로 변환
"""
import re

# 한글 숫자 단위
DIGITS = ['영', '일', '이', '삼', '사', '오', '육', '칠', '팔', '구']
UNITS_SMALL = ['', '십', '백', '천']
UNITS_BIG = ['', '만', '억', '조']

def number_to_korean(num_str):
    """정수 문자열을 한글로 변환 (쉼표 제거 포함)"""
    num_str = num_str.replace(',', '')
    if not num_str.isdigit():
        return num_str
    
    n = int(num_str)
    if n == 0:
        return '영'
    
    result = []
    # 4자리씩 끊어서 처리
    groups = []
    s = str(n)
    while s:
        groups.insert(0, s[-4:])
        s = s[:-4]
    
    for gi, group in enumerate(groups):
        big_unit_idx = len(groups) - 1 - gi
        group_val = int(group)
        if group_val == 0:
            continue
        
        group_str = ''
        padded = group.zfill(4)
        for di, ch in enumerate(padded):
            d = int(ch)
            unit_idx = 3 - di  # 천,백,십,일
            if d == 0:
                continue
            if d == 1 and unit_idx > 0:
                # 일십, 일백, 일천은 그냥 십, 백, 천
                group_str += UNITS_SMALL[unit_idx]
            else:
                group_str += DIGITS[d] + UNITS_SMALL[unit_idx]
        
        result.append(group_str + UNITS_BIG[big_unit_idx])
    
    return ''.join(result)

def decimal_to_korean(decimal_str):
    """소수점 이하를 한 자리씩 읽기: 0.123 -> 영점일이삼"""
    parts = decimal_str.split('.')
    integer_part = number_to_korean(parts[0])
    
    if len(parts) == 1:
        return integer_part
    
    # 소수점 이하는 한 자리씩 읽음
    decimal_part = ''.join(DIGITS[int(d)] for d in parts[1])
    return f"{integer_part}점{decimal_part}"

def preprocess_for_tts(text):
    """텍스트 내 숫자를 한글 발음으로 변환 + Supertonic 미지원 특수문자 제거 + 단위/약자 한글화"""

    # 0) Supertonic 미지원 특수문자 제거 (CLAUDE.md 명시)
    text = re.sub(r'[■▶★●◆▲※→←▼◀►◇□☆◎※♣♠♥♦◈◐◑]', '', text)

    # 0-1) 단위 기호 한글 발음 (TTS가 못 읽는 기호)
    text = text.replace('㎡', '엠투')
    text = text.replace('㎢', '제곱킬로미터')
    text = text.replace('㎝', '센티미터')
    text = text.replace('㎜', '밀리미터')
    text = text.replace('㎏', '킬로그램')

    # 0-2) 지목 1글자 약자 → 풀어쓰기 (괄호 안만)
    jimok_map = {
        '대': '대지', '도': '도로', '전': '밭', '답': '논',
        '임': '임야', '과': '과수원', '목': '목장용지', '잡': '잡종지',
        '학': '학교용지', '공': '공장용지', '창': '창고용지',
        '주': '주차장', '하': '하천', '구': '구거', '제': '제방',
        '원': '유원지', '체': '체육용지', '종': '종교용지', '사': '사적지',
        '묘': '묘지', '광': '광천지', '염': '염전', '철': '철도용지',
        '수': '수도용지', '유': '유지', '양': '양어장', '주차': '주차장',
    }
    def expand_jimok(m):
        ch = m.group(1)
        return '(' + jimok_map.get(ch, ch) + ')'
    text = re.sub(r'\(([가-힣])\)', expand_jimok, text)

    # 1) 퍼센트: 4.75% -> 사점칠오퍼센트
    text = re.sub(r'(\d+(?:,\d{3})*\.?\d*)%',
                  lambda m: decimal_to_korean(m.group(1).replace(',', '')) + '퍼센트', text)

    # 2) 쉼표 + 소수점 통합: 14,046.60 -> 일만사천사십육점육영
    text = re.sub(r'(\d{1,3}(?:,\d{3})+\.\d+)',
                  lambda m: decimal_to_korean(m.group(1).replace(',', '')), text)

    # 3) 쉼표 포함 정수: 3,330 -> 삼천삼백삼십
    text = re.sub(r'(\d{1,3}(?:,\d{3})+)',
                  lambda m: number_to_korean(m.group(1)), text)

    # 4) 일반 소수점: 0.123 -> 영점일이삼
    text = re.sub(r'(\d+\.\d+)', lambda m: decimal_to_korean(m.group(1)), text)

    # 5) 범위 표현: 10~15평 -> 십내지십오평, 280~425세대 -> 이백팔십내지사백이십오세대
    def range_repl(m):
        a, b = m.group(1), m.group(2)
        ak = number_to_korean(a) if not any(c == '.' for c in a) else decimal_to_korean(a)
        bk = number_to_korean(b) if not any(c == '.' for c in b) else decimal_to_korean(b)
        return f"{ak}내지{bk}"
    text = re.sub(r'(\d+(?:\.\d+)?)~(\d+(?:\.\d+)?)', range_repl, text)

    # 6) 일반 숫자 (단위 붙은 것): 500m -> 오백m
    text = re.sub(r'(?<!\d)(\d+)(?=명|세대|원|호선|종|개|곳|층|년|월|일|m|km|세|평|엠투)',
                  lambda m: number_to_korean(m.group(1)), text)

    return text


# === 테스트 ===
if __name__ == "__main__":
    tests = [
        "이 지역의 인구는 3,330명이며, 세대수는 1,245세대입니다. 면적은 25,800제곱미터이고, 공시지가는 제곱미터당 2,150,000원입니다.",
        "건폐율은 0.6이며, 용적률은 2.5입니다. 출산율은 0.123명까지 떨어졌고, 평당 가격은 3.3제곱미터 기준 1,850만원입니다. 수익률은 4.75%로 예상됩니다.",
        "K-9 자주포는 대한민국 육군의 주력 화포입니다. F-35 전투기와 함께 운용됩니다. 이 토지는 제2종 일반주거지역이며, 국도 1호선에서 500m 거리에 위치합니다. COVID-19 이후 부동산 시장이 변화했습니다."
    ]
    
    for i, t in enumerate(tests, 1):
        converted = preprocess_for_tts(t)
        print(f"\n[TEST {i}]")
        print(f"  IN:  {t}")
        print(f"  OUT: {converted}")
