"""scene_detail v14 schema validation."""
import json
from pathlib import Path

import jsonschema
import pytest

PROMPT_DIR = (
    Path(__file__).resolve().parent.parent.parent.parent
    / "prompts" / "_base" / "scene_detail" / "14.202605031033"
)
SCHEMA = json.loads((PROMPT_DIR / "detail_schema.json").read_text())


def _valid_variation():
    return {
        "variant_label": "var_1",
        "camera_effect": "eye-level wide",
        "t2i_prompt": "prompt text",
        "outfit_assignments": [{"character_id": "C01", "outlook_id": "O02"}],
        "source_facts": ["S## action: text"],
        "visual_inferences": ["inf"],
        "creative_decisions": ["dec"],
        "confidence": "high",
    }


def _valid_scene():
    return {
        "scene_index": 12,
        "heading": "S##. interior - night",
        "beat_title": "discovery",
        "representative_moment": "moment",
        "t2i_variations": [_valid_variation()],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "",
    }


class TestV14Schema:
    def test_valid_scene_passes(self):
        jsonschema.validate(_valid_scene(), SCHEMA)

    def test_missing_source_facts_fails(self):
        scene = _valid_scene()
        del scene["t2i_variations"][0]["source_facts"]
        with pytest.raises(jsonschema.ValidationError):
            jsonschema.validate(scene, SCHEMA)

    def test_missing_visual_inferences_fails(self):
        scene = _valid_scene()
        del scene["t2i_variations"][0]["visual_inferences"]
        with pytest.raises(jsonschema.ValidationError):
            jsonschema.validate(scene, SCHEMA)

    def test_missing_creative_decisions_fails(self):
        scene = _valid_scene()
        del scene["t2i_variations"][0]["creative_decisions"]
        with pytest.raises(jsonschema.ValidationError):
            jsonschema.validate(scene, SCHEMA)

    def test_missing_confidence_fails(self):
        scene = _valid_scene()
        del scene["t2i_variations"][0]["confidence"]
        with pytest.raises(jsonschema.ValidationError):
            jsonschema.validate(scene, SCHEMA)

    def test_legacy_confidence_rejected(self):
        scene = _valid_scene()
        scene["t2i_variations"][0]["confidence"] = "legacy"
        with pytest.raises(jsonschema.ValidationError):
            jsonschema.validate(scene, SCHEMA)

    def test_unknown_confidence_rejected(self):
        scene = _valid_scene()
        scene["t2i_variations"][0]["confidence"] = "unknown"
        with pytest.raises(jsonschema.ValidationError):
            jsonschema.validate(scene, SCHEMA)

    def test_all_three_enum_values_valid(self):
        for value in ["high", "medium", "low"]:
            scene = _valid_scene()
            scene["t2i_variations"][0]["confidence"] = value
            jsonschema.validate(scene, SCHEMA)

    def test_empty_lists_pass(self):
        scene = _valid_scene()
        scene["t2i_variations"][0]["source_facts"] = []
        scene["t2i_variations"][0]["visual_inferences"] = []
        scene["t2i_variations"][0]["creative_decisions"] = []
        scene["t2i_variations"][0]["confidence"] = "low"
        jsonschema.validate(scene, SCHEMA)

    def test_extra_variation_field_rejected(self):
        scene = _valid_scene()
        scene["t2i_variations"][0]["extra"] = "X"
        with pytest.raises(jsonschema.ValidationError):
            jsonschema.validate(scene, SCHEMA)
