from __future__ import annotations

import pytest

from src.domain.email.presentation import (
    ApplicationBranding,
    EmailMessage,
    EmailPresentation,
    magic_link_message,
    render_transactional_email,
)


def test_magic_link_is_app_aware_and_has_html_and_text() -> None:
    message = magic_link_message(
        recipient="person@example.com",
        app_name="Acme Portal",
        link_url="https://acme.example/auth/verify?token=a&next=/",
        ttl_minutes=10,
    )
    html, text = render_transactional_email(message)
    assert message.subject == "Sign in to Acme Portal"
    assert "Acme Portal" in html
    assert "Sign in" in html
    assert "https://acme.example/auth/verify?token=a&amp;next=/" in html
    assert "https://acme.example/auth/verify?token=a&next=/" in text
    assert "Sent securely via P2HS" in text
    assert "<script" not in html


def test_unsafe_branding_is_neutralized_and_logo_is_not_html() -> None:
    branding = ApplicationBranding(
        name='<img src=x onerror="alert(1)">',
        logo_url="javascript:alert(1)",
        accent_color="white",
    )
    message = EmailMessage(
        recipient="a@example.com",
        branding=branding,
        presentation=EmailPresentation(
            template_key="booking.confirmation",
            template_version="booking.confirmation.v1",
            title="Booking confirmed",
            intro="Your appointment is confirmed.",
        ),
        subject="Booking confirmed",
    )
    html, _ = render_transactional_email(message)
    assert "&lt;img" in html
    assert "javascript:" not in html


def test_action_url_scheme_is_validated() -> None:
    with pytest.raises(ValueError):
        render_transactional_email(
            magic_link_message(
                recipient="a@example.com",
                app_name="App",
                link_url="javascript:alert(1)",
                ttl_minutes=10,
            )
        )


def test_template_version_is_stable() -> None:
    assert magic_link_message(
        recipient="a@example.com", app_name="App", link_url="https://app.example/x", ttl_minutes=10
    ).presentation.template_version == "auth.magic_link.v1"


def test_html_declares_dark_mode_support() -> None:
    html, _ = render_transactional_email(
        magic_link_message(
            recipient="a@example.com", app_name="App", link_url="https://app.example/x", ttl_minutes=10
        )
    )
    assert 'name="color-scheme" content="light dark"' in html
    assert "prefers-color-scheme: dark" in html
    assert 'class="p2-card"' in html
    assert 'class="p2-body"' in html


def test_support_identity_renders_as_mailto_and_falls_back_to_text() -> None:
    message = EmailMessage(
        recipient="a@example.com",
        branding=ApplicationBranding(name="Acme", support_identity="help@acme.example"),
        presentation=EmailPresentation(
            template_key="booking.confirmation",
            template_version="booking.confirmation.v1",
            title="Booking confirmed",
            intro="Your appointment is confirmed.",
        ),
        subject="Booking confirmed",
    )
    html, text = render_transactional_email(message)
    assert 'href="mailto:help@acme.example"' in html
    assert "Need help? Contact" in html
    assert "Need help? Contact help@acme.example" in text

    no_support = EmailMessage(
        recipient="a@example.com",
        branding=ApplicationBranding(name="Acme"),
        presentation=message.presentation,
        subject="Booking confirmed",
    )
    html2, text2 = render_transactional_email(no_support)
    assert "Need help?" not in html2
    assert "Need help?" not in text2

    plain_support = EmailMessage(
        recipient="a@example.com",
        branding=ApplicationBranding(name="Acme", support_identity="<script>call us</script>"),
        presentation=message.presentation,
        subject="Booking confirmed",
    )
    html3, _ = render_transactional_email(plain_support)
    assert "mailto:" not in html3
    assert "&lt;script&gt;" in html3
