"""ticket_emails: a per-tenant, per-category list of team notification addresses."""
from unittest.mock import MagicMock

import pytest

from app.services.chat.tools_settings import (
    TICKET_CATEGORIES, apply_over_defaults, save_tool_settings,
)


def _mock_store(monkeypatch, initial=None):
    stored = {"value": initial}

    def fake_update_setting(tenant_id, key, fn):
        stored["value"] = fn(stored["value"])
        return stored["value"]

    def fake_get_tool_settings(tenant_id):
        return apply_over_defaults(stored["value"])

    monkeypatch.setattr(
        "app.services.chat.tools_settings.update_setting", fake_update_setting)
    monkeypatch.setattr(
        "app.services.chat.tools_settings.read_legacy_blob", lambda t: None)
    monkeypatch.setattr(
        "app.services.chat.tools_settings.get_tool_settings", fake_get_tool_settings)
    return stored


def test_a_fresh_tenant_has_no_business_emails():
    assert apply_over_defaults(None)["ticket_emails"] == []


def test_the_category_tuple_has_exactly_the_three_dashboard_options():
    assert TICKET_CATEGORIES == ("General enquiries", "Sales", "Business")


def test_a_legacy_stored_blob_with_no_ticket_emails_key_does_not_crash():
    settings = apply_over_defaults({"features": {}, "email": {}})
    assert settings["ticket_emails"] == []


def test_save_accepts_a_valid_list(monkeypatch):
    _mock_store(monkeypatch)
    saved = save_tool_settings("org_ticket_test", ticket_emails=[
        {"email": "sales@acme.com", "category": "Sales"},
        {"email": "support@acme.com", "category": "General enquiries"},
    ])
    assert saved["ticket_emails"] == [
        {"email": "sales@acme.com", "category": "Sales"},
        {"email": "support@acme.com", "category": "General enquiries"},
    ]


def test_save_rejects_an_invalid_email(monkeypatch):
    _mock_store(monkeypatch)
    with pytest.raises(ValueError, match="not a valid email"):
        save_tool_settings("org_ticket_test", ticket_emails=[
            {"email": "not-an-email", "category": "Sales"}])


def test_save_rejects_an_unknown_category(monkeypatch):
    _mock_store(monkeypatch)
    with pytest.raises(ValueError, match="must be one of"):
        save_tool_settings("org_ticket_test", ticket_emails=[
            {"email": "sales@acme.com", "category": "Marketing"}])


def test_save_rejects_an_entry_missing_a_field(monkeypatch):
    _mock_store(monkeypatch)
    with pytest.raises(ValueError, match="email.*category"):
        save_tool_settings("org_ticket_test", ticket_emails=[{"email": "sales@acme.com"}])


def test_save_replaces_the_whole_list_not_merges(monkeypatch):
    _mock_store(monkeypatch, initial={
        "features": {}, "email": {},
        "ticket_emails": [{"email": "old@acme.com", "category": "Sales"}]})
    saved = save_tool_settings("org_ticket_test", ticket_emails=[
        {"email": "new@acme.com", "category": "Business"}])
    assert saved["ticket_emails"] == [{"email": "new@acme.com", "category": "Business"}]


def test_omitting_ticket_emails_leaves_the_stored_list_untouched(monkeypatch):
    _mock_store(monkeypatch, initial={
        "features": {}, "email": {},
        "ticket_emails": [{"email": "old@acme.com", "category": "Sales"}]})
    saved = save_tool_settings("org_ticket_test", features={"voice_mode": False})
    assert saved["ticket_emails"] == [{"email": "old@acme.com", "category": "Sales"}]


def test_save_accepts_an_empty_list_to_clear_all_business_emails(monkeypatch):
    _mock_store(monkeypatch, initial={
        "features": {}, "email": {},
        "ticket_emails": [{"email": "old@acme.com", "category": "Sales"}]})
    saved = save_tool_settings("org_ticket_test", ticket_emails=[])
    assert saved["ticket_emails"] == []
