import pytest

from app.generation.prompts import (
    build_general_messages,
    build_query_messages,
    build_query_messages_structured,
    build_system_prompt,
)
from app.models.intent import QueryIntent


def test_system_prompt_varies_by_intent():
    code_prompt = build_system_prompt(QueryIntent.CODE_LOOKUP)
    doc_prompt = build_system_prompt(QueryIntent.DOCUMENTATION)
    assert "code locations" in code_prompt.lower() or "symbols" in code_prompt.lower()
    assert code_prompt != doc_prompt


def test_system_prompt_includes_security_rules():
    prompt = build_system_prompt(QueryIntent.GENERAL)
    lowered = prompt.lower()
    assert "untrusted data" in lowered
    assert "never reveal secrets" in lowered
    assert "exploit-ready" in lowered


def test_build_query_messages_includes_context():
    messages = build_query_messages(
        question="Where is Foo?",
        intent=QueryIntent.CODE_LOOKUP,
        context_text="[1] foo.go (Foo)\nfunc Foo() {}",
    )
    assert messages[0]["role"] == "system"
    assert "[1]" in messages[1]["content"]
    assert "Where is Foo?" in messages[1]["content"]


def test_build_query_messages_structured_requests_json_contract():
    messages = build_query_messages_structured(
        question="Where is Foo?",
        intent=QueryIntent.CODE_LOOKUP,
        context_text="[1] foo.go (Foo)\nfunc Foo() {}",
    )
    assert len(messages) == 2
    assert messages[0]["role"] == "system"
    assert messages[1]["role"] == "user"
    system = messages[0]["content"].lower()
    assert "untrusted data" in system
    assert "used_indices" in system
    assert "reasoning" in system
    assert "json" in system
    assert "never invent" in system or "never invent sources" in system
    user = messages[1]["content"]
    assert "[1] foo.go (Foo)" in user
    assert "Where is Foo?" in user
    assert "json only" in user.lower()


def test_build_general_messages_includes_security_rules():
    messages = build_general_messages(question="Generate Java code")
    assert messages[0]["role"] == "system"
    assert messages[1]["content"] == "Generate Java code"
    lowered = messages[0]["content"].lower()
    assert "general coding assistant" in lowered
    assert "never reveal secrets" in lowered
    assert "exploit-ready" in lowered
