"""
i18n 단위 테스트.
"""
import os
import sys
import pytest

sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

from core.i18n import tr, tr_html, set_language, available_languages, language_label


@pytest.fixture(autouse=True)
def reset_language():
    """매 테스트 후 ko로 원복."""
    yield
    set_language('ko')


class TestBasicTranslation:
    def test_korean_default(self):
        set_language('ko')
        assert '저장' in tr('btn.save')

    def test_english_switch(self):
        set_language('en')
        assert 'Save' in tr('btn.save')

    def test_missing_key_fallback_to_self(self):
        set_language('en')
        assert tr('non.existent.key') == 'non.existent.key'

    def test_missing_in_en_falls_back_to_ko(self):
        # ko에만 있는 키가 있으면 en에서도 ko 값 (현재 사전엔 없지만 정책 검증)
        # 이 테스트는 정책 보장만 함 (사전이 비대칭일 때 안전망)
        set_language('en')
        # 모든 카테고리는 양 언어 균형 있게 정의되어야 함
        for key in ['btn.save', 'menu.stats', 'window.settings']:
            assert tr(key) != key  # 빈 fallback이 아님


class TestFormatArgs:
    def test_minutes_arg_korean(self):
        set_language('ko')
        msg = tr('notif.clock_out_soon.body', minutes=15)
        assert '15' in msg

    def test_hours_float_arg(self):
        set_language('ko')
        msg = tr('notif.weekly_52.body', hours=58.5)
        assert '58.5' in msg

    def test_missing_arg_graceful(self):
        # 필요한 인자 없이 format → 빈 문자열 아님
        set_language('ko')
        msg = tr('notif.clock_out_soon.body')
        assert msg  # 키 그대로라도 비지 않음


class TestHelpHtml:
    def test_korean_html(self):
        set_language('ko')
        assert '환영' in tr_html('help.html.intro')

    def test_english_html(self):
        set_language('en')
        assert 'Welcome' in tr_html('help.html.intro')

    def test_missing_html_returns_placeholder(self):
        set_language('ko')
        result = tr_html('help.html.nonexistent')
        assert '<p>missing:' in result


class TestLanguageMeta:
    def test_available_languages_includes_ko_en(self):
        langs = available_languages()
        assert 'ko' in langs
        assert 'en' in langs

    def test_language_label(self):
        assert language_label('ko') == '한국어'
        assert language_label('en') == 'English'
