"""Tests for alerting."""

from __future__ import annotations

from types import SimpleNamespace

from sb_scout.alerts import build_alert_payload, check_alerts, send_msmtp_email
from sb_scout.models import AlertConfig


class TestCheckAlerts:
    def test_no_thresholds(self):
        assert check_alerts([{"score_overall_rank": 0.9}], AlertConfig()) == []

    def test_overall_threshold(self):
        rows = [
            {"score_overall_rank": 0.9, "score_cpu_rank": 0.5, "score_storage_rank": 0.5, "price_amount": 80},
            {"score_overall_rank": 0.3, "score_cpu_rank": 0.2, "score_storage_rank": 0.2, "price_amount": 40},
        ]
        hits = check_alerts(rows, AlertConfig(min_overall_score=0.8))
        assert len(hits) == 1
        assert hits[0]["score_overall_rank"] == 0.9

    def test_max_price_threshold(self):
        rows = [
            {"score_overall_rank": 0.5, "score_cpu_rank": 0.5, "score_storage_rank": 0.5, "price_amount": 30},
            {"score_overall_rank": 0.5, "score_cpu_rank": 0.5, "score_storage_rank": 0.5, "price_amount": 80},
        ]
        hits = check_alerts(rows, AlertConfig(max_price=50.0))
        assert len(hits) == 1
        assert hits[0]["price_amount"] == 30

    def test_multiple_thresholds(self):
        rows = [
            {"score_overall_rank": 0.9, "score_cpu_rank": 0.95, "score_storage_rank": 0.5, "price_amount": 80},
        ]
        hits = check_alerts(rows, AlertConfig(min_overall_score=0.8, min_cpu_score=0.9))
        assert len(hits) == 1


class TestEmailAlerts:
    def test_build_alert_payload(self):
        payload = build_alert_payload([{"id": 1, "price_amount": 40}])
        assert '"alert_count": 1' in payload
        assert '"id": 1' in payload

    def test_msmtp_not_installed(self, monkeypatch):
        monkeypatch.setattr("shutil.which", lambda name: None)
        ok = send_msmtp_email(AlertConfig(email_to=("ops@example.com",)), [{"id": 1}])
        assert ok is False

    def test_msmtp_invoked(self, monkeypatch):
        calls = []

        def fake_run(cmd, input=None, timeout=None, check=None):
            calls.append({"cmd": cmd, "input": input, "timeout": timeout, "check": check})
            return SimpleNamespace(returncode=0)

        monkeypatch.setattr("shutil.which", lambda name: "/usr/bin/msmtp")
        monkeypatch.setattr("subprocess.run", fake_run)

        ok = send_msmtp_email(
            AlertConfig(
                email_to=("ops@example.com", "team@example.com"),
                email_from="bot@example.com",
                email_subject="Deals found",
                email_account="default",
            ),
            [{"id": 1, "price_amount": 40}],
        )

        assert ok is True
        assert calls[0]["cmd"] == ["/usr/bin/msmtp", "-a", "default", "ops@example.com", "team@example.com"]
        assert b"Subject: Deals found" in calls[0]["input"]
        assert b"To: ops@example.com, team@example.com" in calls[0]["input"]
