"""Phase 8.1: visual_context_helper unit tests."""
from __future__ import annotations

from app.services.visual_context_helper import (
    build_visual_context_block,
    extract_source_language,
)


def test_build_block_with_world_guide_only():
    wg = {
        "data": {
            "world_setting_summary": "S",
            "world_time_period": "T",
            "technology_level": "Tech",
            "era_guardrails": ["E1", "E2"],
            "costume_guardrails": ["C1"],
            "prohibited_visual_misreads": ["P1"],
            "continuity_guardrails": ["CT1"],
            "image_generation_notes": ["IG1"],
            "style_rules": {
                "must_maintain": ["MM1"],
                "must_avoid": ["MA1"],
            },
        }
    }
    out = build_visual_context_block(world_guide_cp=wg, visual_world_rules_cp=None)
    assert "World setting summary" in out
    assert "S" in out
    assert "Era guardrails" in out
    assert "- E1" in out
    assert "Style — must maintain" in out
    assert "- MM1" in out
    assert "Style — must avoid" in out


def test_build_block_with_visual_world_rules_only():
    vwr = {
        "data": {
            "era": "현대",
            "region": "대한민국",
            "t2i_context": "Korean drama",
            "rules": [
                {"rule_type": "costume", "description": "D", "visual_guideline": "G"}
            ],
            "director_notes": ["N1"],
        }
    }
    out = build_visual_context_block(world_guide_cp=None, visual_world_rules_cp=vwr)
    assert "Era" in out and "현대" in out
    assert "Region" in out and "대한민국" in out
    assert "T2I style context" in out and "Korean drama" in out
    assert "[costume] D → G" in out
    assert "Director notes" in out and "- N1" in out


def test_build_block_combines_both_sources():
    wg = {"data": {"world_setting_summary": "WS"}}
    vwr = {"data": {"era": "E"}}
    out = build_visual_context_block(world_guide_cp=wg, visual_world_rules_cp=vwr)
    assert "World setting summary" in out
    assert "Era" in out


def test_build_block_returns_empty_when_both_missing():
    assert build_visual_context_block() == ""
    assert build_visual_context_block(world_guide_cp={}, visual_world_rules_cp={}) == ""


def test_extract_source_language_explicit_wins():
    vwr = {"data": {"source_language": "ko", "era": "modern", "region": "USA"}}
    assert extract_source_language(vwr) == "ko"


def test_extract_source_language_fallback_korean():
    """vwr v3 cp 에 source_language 없어도 era/region 한국어로 ko 자동 감지."""
    vwr = {"data": {"era": "현대", "region": "대한민국 서해안"}}
    assert extract_source_language(vwr) == "ko"


def test_extract_source_language_fallback_japanese():
    """일본어 텍스트(가나 포함)에서 ja 추론 — 한자만 있는 경우 zh로 분류된다는
    제약은 의도된 동작 (가나가 있어야 일본어 확정 가능).
    """
    vwr = {"data": {"era": "現代", "region": "東京の街並み"}}  # の/み = 히라가나
    assert extract_source_language(vwr) == "ja"


def test_extract_source_language_fallback_english():
    vwr = {"data": {"era": "modern", "region": "America"}}
    assert extract_source_language(vwr) == "en"


def test_extract_source_language_empty_returns_none():
    assert extract_source_language(None) is None
    assert extract_source_language({}) is None
    assert extract_source_language({"data": {}}) is None
