"""--demo / --list-languages（APIキー不要のオフライン動作）の検証。

実変換は Anthropic API が必要だが、デモ・言語一覧は SDK 無しで即動く
（main は migrator を遅延 import する）ことを保証する。
"""
import os
import subprocess
import sys
from pathlib import Path

ROOT = Path(__file__).resolve().parent.parent


def _run(*flags):
    env = dict(os.environ)
    env.pop("ANTHROPIC_API_KEY", None)  # キー無し状態で実行
    return subprocess.run(
        [sys.executable, str(ROOT / "main.py"), *flags],
        cwd=str(ROOT),
        capture_output=True,
        text=True,
        encoding="utf-8",
        errors="replace",
        env=env,
    )


def test_sample_exists():
    assert (ROOT / "samples" / "hello.py").is_file()


def test_demo_runs_offline_without_api_key():
    result = _run("--demo")
    assert result.returncode == 0, result.stderr
    out = result.stdout
    assert "DEMO MODE" in out
    # サニタイザがマークダウンフェンス/前置きを除去している
    assert "Here is the converted" not in out.split("--- after ---")[1]
    assert "fn main()" in out
    # API キー未設定時はヒントを表示
    assert "ANTHROPIC_API_KEY" in out


def test_list_languages_offline():
    result = _run("--list-languages")
    assert result.returncode == 0, result.stderr
    assert "languages" in result.stdout.lower()


def test_custom_language_is_accepted_not_rejected(tmp_path):
    """一覧に無い言語でも『カスタム言語』として受理され、Unknown で弾かれない。"""
    src = tmp_path / "in"
    src.mkdir()
    (src / "sample.zzz").write_text("BEGIN END.", encoding="utf-8")
    out = tmp_path / "out"
    # 未知の元言語 + --ext を指定（API キー無しなので変換段階で失敗するが、
    # 言語バリデーションは通過することを検証する）
    result = subprocess.run(
        [sys.executable, str(ROOT / "main.py"),
         "-i", str(src), "-o", str(out), "-s", "MyLegacyLang", "-t", "Python",
         "--ext", ".zzz"],
        cwd=str(ROOT), capture_output=True, text=True, encoding="utf-8", errors="replace",
        env={**os.environ, "ANTHROPIC_API_KEY": "", "PYTHONIOENCODING": "utf-8"},
    )
    combined = result.stdout + result.stderr
    # 旧挙動（即 Unknown でエラー終了）ではないこと
    assert "Unknown source language" not in combined
    # カスタム言語として警告つきで受理されたこと
    assert "カスタム元言語" in combined


def test_missing_ext_for_custom_source_errors(tmp_path):
    """カスタム元言語で --ext 未指定なら、拡張子不明として明確にエラー。"""
    src = tmp_path / "in"
    src.mkdir()
    out = tmp_path / "out"
    result = subprocess.run(
        [sys.executable, str(ROOT / "main.py"),
         "-i", str(src), "-o", str(out), "-s", "MyLegacyLang", "-t", "Python"],
        cwd=str(ROOT), capture_output=True, text=True, encoding="utf-8", errors="replace",
        env={**os.environ, "ANTHROPIC_API_KEY": "", "PYTHONIOENCODING": "utf-8"},
    )
    assert result.returncode != 0
    assert "--ext" in (result.stdout + result.stderr)
