from unittest.mock import AsyncMock, MagicMock, patch

import pytest

from app.modules.core.application.alert_service import BrevoEmailService


@pytest.mark.anyio
async def test_send_email_success():
    mock_resp = MagicMock()
    mock_resp.status_code = 201
    mock_resp.json.return_value = {"messageId": "<test-msg-123@smtp-brevo.com>"}

    with patch("httpx.AsyncClient.post", new_callable=AsyncMock) as mock_post:
        mock_post.return_value = mock_resp
        res = await BrevoEmailService.send_email(
            recipient_email="test@dinhsonconstruction.com",
            subject="Test Subject",
            html_content="<p>Test</p>",
        )
        assert res["success"] is True
        assert res["message_id"] == "<test-msg-123@smtp-brevo.com>"


@pytest.mark.anyio
async def test_send_system_log_alert_success():
    mock_resp = MagicMock()
    mock_resp.status_code = 201
    mock_resp.json.return_value = {"messageId": "<alert-123@smtp-brevo.com>"}

    with patch("httpx.AsyncClient.post", new_callable=AsyncMock) as mock_post:
        mock_post.return_value = mock_resp
        success = await BrevoEmailService.send_system_log_alert(
            error_title="Test Database Connection Lost",
            exception=ValueError("Mock DB Connection Timeout"),
            module_name="PostgreSQL Core",
            extra_context={"Host": "127.0.0.1", "Port": 5432},
        )
        assert success is True
