from timmy.prompts import STATUS_PROMPT, SYSTEM_PROMPT, get_system_prompt


def test_system_prompt_not_empty():
    assert SYSTEM_PROMPT.strip()


def test_system_prompt_no_persona_identity():
    """System prompt should NOT contain persona identity references."""
    prompt = SYSTEM_PROMPT.lower()
    assert "sir, affirmative" not in prompt
    assert "christian" not in prompt
    assert "bitcoin" not in prompt


def test_system_prompt_references_local():
    assert "local" in SYSTEM_PROMPT.lower()


def test_system_prompt_is_multiline():
    assert "\n" in SYSTEM_PROMPT


def test_status_prompt_not_empty():
    assert STATUS_PROMPT.strip()


def test_status_prompt_no_persona():
    """Status prompt should not reference a persona."""
    assert "Timmy" not in STATUS_PROMPT


def test_prompts_are_distinct():
    assert SYSTEM_PROMPT != STATUS_PROMPT


def test_get_system_prompt_injects_model_name():
    """System prompt should inject actual model name from config."""
    prompt = get_system_prompt(tools_enabled=False)
    # Should contain the model name from settings, not the placeholder
    assert "{model_name}" not in prompt
    assert "llama3.1" in prompt or "qwen" in prompt


def test_full_prompt_brevity_first():
    """Full prompt should front-load brevity instructions before other content."""
    prompt = get_system_prompt(tools_enabled=True)
    brevity_pos = prompt.find("BREVITY")
    tool_pos = prompt.find("TOOL USAGE")
    memory_pos = prompt.find("MEMORY")
    # Brevity section must appear before tools and memory
    assert brevity_pos != -1, "Full prompt must contain BREVITY section"
    assert brevity_pos < tool_pos, "Brevity must come before tool usage"
    assert brevity_pos < memory_pos, "Brevity must come before memory"


def test_full_prompt_no_markdown_headers():
    """Full prompt should not use markdown headers (## / ###) that teach
    the model to respond in markdown."""
    prompt = get_system_prompt(tools_enabled=True)
    for line in prompt.splitlines():
        stripped = line.strip()
        assert not stripped.startswith("## "), f"Full prompt uses markdown header: {stripped!r}"
        assert not stripped.startswith("### "), (
            f"Full prompt uses markdown sub-header: {stripped!r}"
        )


def test_full_prompt_plain_text_brevity():
    """Full prompt should explicitly instruct plain text output."""
    prompt = get_system_prompt(tools_enabled=True).lower()
    assert "plain text" in prompt


def test_lite_prompt_brevity():
    """Lite prompt should also instruct brevity."""
    prompt = get_system_prompt(tools_enabled=False).lower()
    assert "brief" in prompt
    assert "plain text" in prompt or "not markdown" in prompt
