"""src.gui_model と src.i18n の単体テスト。"""
import pathlib
import sys

ROOT = pathlib.Path(__file__).resolve().parent.parent
sys.path.insert(0, str(ROOT))

from src.gui_model import ConversionConfig, ConversionState, MODEL_OPTIONS
from src.i18n import I18n, TRANSLATIONS


class TestConversionConfig:
    def test_defaults(self):
        c = ConversionConfig()
        assert c.model == "claude-sonnet-4-20250514"
        assert c.encoding == "utf-8"
        assert c.enable_resume and c.enable_context and c.enable_ecosystem


class TestConversionState:
    def test_reset_clears_all_counters(self):
        s = ConversionState(is_running=True, total_files=10, success_count=5,
                            error_count=2, current_file="x.py", details=[1, 2])
        s.reset()
        assert not s.is_running
        assert s.total_files == 0
        assert s.success_count == 0
        assert s.error_count == 0
        assert s.current_file == ""
        assert s.details == []

    def test_details_default_is_independent(self):
        a, b = ConversionState(), ConversionState()
        a.details.append("x")
        assert b.details == []  # default_factory なので共有されない


class TestModelOptions:
    def test_labels_match_model_ids(self):
        # ラベルのバージョン表記と実 ID が矛盾しないこと（例: Haiku 4.5）
        for label, model_id in MODEL_OPTIONS:
            assert label and model_id.startswith("claude-")
            if "Haiku" in label:
                assert "haiku" in model_id
            if "Sonnet" in label:
                assert "sonnet" in model_id
            if "Opus" in label:
                assert "opus" in model_id

    def test_haiku_label_version_matches_id(self):
        haiku = [m for lbl, m in MODEL_OPTIONS if "Haiku" in lbl][0]
        labels = [lbl for lbl, m in MODEL_OPTIONS if "Haiku" in lbl][0]
        # ID が 4-5 なのでラベルも 4.5
        assert "4-5" in haiku and "4.5" in labels


class TestI18n:
    def test_translation_key_parity_ja_en(self):
        en_keys = set(TRANSLATIONS["en"].keys())
        ja_keys = set(TRANSLATIONS["ja"].keys())
        assert en_keys == ja_keys, (
            f"翻訳キー不一致 en-only={en_keys - ja_keys} ja-only={ja_keys - en_keys}"
        )

    def test_ja_lookup(self):
        i = I18n("ja")
        # 任意の既知キーで ja の値が返る（en と異なる、または同一でも可）
        any_key = next(iter(TRANSLATIONS["ja"]))
        assert i.t(any_key) == TRANSLATIONS["ja"][any_key]

    def test_unknown_lang_falls_back_to_en(self):
        i = I18n("xx")
        any_key = next(iter(TRANSLATIONS["en"]))
        assert i.t(any_key) == TRANSLATIONS["en"][any_key]

    def test_unknown_key_returns_key(self):
        assert I18n("en").t("___no_such_key___") == "___no_such_key___"

    def test_kwargs_formatting(self):
        # フォーマット用プレースホルダを持つキーがあれば format される
        i = I18n("en")
        # 任意のキーに {x} を含むものを探す。無ければ key 自体で format をテスト
        fmt_key = next((k for k, v in TRANSLATIONS["en"].items() if "{" in v and "}" in v), None)
        if fmt_key is None:
            return
        # 例外なくフォーマットできること（必要な引数が分からないので緩く検証）
        try:
            i.t(fmt_key)  # 引数なしでも落ちない場合はそれを許容
        except (KeyError, IndexError):
            pass
