"""
Tests for Fact Lock: якщо session має doc_facts і питання про прибуток —
ask_about_document НЕ повинна викликатись.
"""
import sys
import os
import asyncio
from unittest.mock import AsyncMock, patch, MagicMock

sys.path.insert(0, os.path.join(os.path.dirname(__file__), ".."))

from crews.agromatrix_crew import session_context as sc
from crews.agromatrix_crew.doc_facts import can_answer_from_facts


FACTS = {
    "profit_uah": 5_972_016.0,
    "fertilizer_uah": 1_521_084.0,
    "area_ha": 497.0,
}


def _setup_session(chat_id: str, facts: dict):
    sc._STORE[chat_id] = {
        **sc._default_session(),
        "doc_facts": facts,
        "updated_at": __import__("time").time(),
    }


def test_can_answer_profit():
    ok, keys = can_answer_from_facts("скільки прибутку у звіті?", FACTS)
    assert ok is True
    assert "profit_uah" in keys


def test_can_answer_fertilizer():
    ok, keys = can_answer_from_facts("витрати на добрива?", FACTS)
    assert ok is True
    assert "fertilizer_uah" in keys


def test_cannot_answer_unknown():
    facts_without_seed = {"area_ha": 497.0}
    ok, keys = can_answer_from_facts("скільки витратили на насіння?", facts_without_seed)
    assert ok is False


def test_session_has_doc_facts():
    chat_id = "test_chat_fact_lock"
    _setup_session(chat_id, FACTS)
    session = sc.load_session(chat_id)
    assert session.get("doc_facts") == FACTS


def test_fact_reuse_bypasses_rag():
    """
    Перевіряємо що can_answer_from_facts повертає True і RAG можна пропустити.
    Це unit-тест логіки bypass; інтеграційний тест потребує мока run.handle_message.
    """
    chat_id = "test_bypass_rag"
    _setup_session(chat_id, FACTS)
    session = sc.load_session(chat_id)
    facts = session.get("doc_facts", {})

    question = "яка сума прибутку у звіті кукурудза?"
    ok, keys = can_answer_from_facts(question, facts)

    # Якщо ok=True — run.py НЕ викликає RAG (за логікою Fact Lock)
    assert ok is True, f"Expected fact reuse, keys={keys}"
