"""Tests for email sender."""

from unittest.mock import MagicMock, patch

from src.config.settings import EmailConfig
from src.reporting.email_sender import send_email, send_smtp


class TestSendSmtp:
    def test_successful_send(self, email_config):
        with patch("src.reporting.email_sender.smtplib.SMTP") as mock_smtp:
            mock_server = MagicMock()
            mock_smtp.return_value.__enter__ = MagicMock(return_value=mock_server)
            mock_smtp.return_value.__exit__ = MagicMock(return_value=False)

            result = send_smtp(email_config, "Test Subject", "<p>Test</p>")

        assert result is True
        mock_server.starttls.assert_called_once()
        mock_server.login.assert_called_once_with("test@gmail.com", "testpass")
        mock_server.sendmail.assert_called_once()

    def test_no_recipients(self):
        config = EmailConfig(
            smtp_host="smtp.gmail.com",
            smtp_user="test@gmail.com",
            smtp_password="pass",
            email_to=[],
        )
        result = send_smtp(config, "Test", "<p>Test</p>")
        assert result is False

    def test_no_credentials(self):
        config = EmailConfig(
            smtp_host="smtp.gmail.com",
            smtp_user="",
            smtp_password="",
            email_to=["test@example.com"],
        )
        result = send_smtp(config, "Test", "<p>Test</p>")
        assert result is False

    def test_smtp_error(self, email_config):
        with patch("src.reporting.email_sender.smtplib.SMTP") as mock_smtp:
            mock_smtp.side_effect = Exception("Connection failed")
            result = send_smtp(email_config, "Test", "<p>Test</p>")
        assert result is False


class TestSendEmail:
    def test_uses_smtp_when_no_sendgrid(self, email_config):
        with patch("src.reporting.email_sender.send_smtp") as mock_smtp:
            mock_smtp.return_value = True
            result = send_email(email_config, "Test", "<p>Test</p>")

        assert result is True
        mock_smtp.assert_called_once()

    def test_uses_sendgrid_when_configured(self):
        config = EmailConfig(
            sendgrid_api_key="SG.test_key",
            sendgrid_from="test@example.com",
            email_to=["recipient@example.com"],
        )
        with patch("src.reporting.email_sender.send_sendgrid") as mock_sg:
            mock_sg.return_value = True
            result = send_email(config, "Test", "<p>Test</p>")

        assert result is True
        mock_sg.assert_called_once()

    def test_override_recipients(self, email_config):
        with patch("src.reporting.email_sender.send_smtp") as mock_smtp:
            mock_smtp.return_value = True
            send_email(
                email_config, "Test", "<p>Test</p>",
                to_addresses=["other@example.com"],
            )

        call_args = mock_smtp.call_args
        assert call_args[0][3] == ["other@example.com"]
