"""
Tests du comportement conversationnel quand une recherche stock ne trouve rien.
"""

import os
import sys
import types
import unittest
from unittest.mock import AsyncMock, MagicMock, patch

sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

sys.modules.setdefault(
    "aiohttp",
    types.SimpleNamespace(ClientTimeout=lambda **kwargs: MagicMock()),
)

from routes import telegram_webhook


class TestEmptyStockResult(unittest.IsolatedAsyncioTestCase):
    async def test_empty_product_search_suggests_retry_instead_of_empty_pdf(self):
        telegram = MagicMock()
        telegram.send_typing_action = AsyncMock()
        telegram.send_message = AsyncMock()
        telegram.send_generating_pdf = AsyncMock()
        telegram.send_upload_action = AsyncMock()
        telegram.send_pdf_to_telegram = AsyncMock()

        odoo = MagicMock()
        odoo.get_stock_for_product.return_value = []
        odoo.search_similar_stock_products.return_value = []
        odoo.get_stock_products.return_value = []

        pdf = MagicMock()
        pdf.generate_stock_pdf.return_value = "pdf/empty.pdf"

        with (
            patch.object(telegram_webhook, "_telegram", telegram),
            patch.object(telegram_webhook, "_odoo", odoo),
            patch.object(telegram_webhook, "_pdf", pdf),
        ):
            await telegram_webhook._process_stock(100, "boite de vis", "Test")

        telegram.send_message.assert_awaited_once()
        sent_text = telegram.send_message.await_args.args[1]
        self.assertIn("aucun article", sent_text.lower())
        self.assertIn("vis", sent_text.lower())
        self.assertIsNotNone(telegram.send_message.await_args.kwargs["reply_markup"])
        keyboard = telegram.send_message.await_args.kwargs["reply_markup"]["inline_keyboard"]
        button_labels = " ".join(row[0]["text"].lower() for row in keyboard)
        self.assertIn("vis", button_labels)
        self.assertIn("stock global", button_labels)
        self.assertIn("catalogue", button_labels)
        pdf.generate_stock_pdf.assert_not_called()
        telegram.send_pdf_to_telegram.assert_not_awaited()
        telegram.send_generating_pdf.assert_not_awaited()


if __name__ == "__main__":
    unittest.main(verbosity=2)
