import smtplib

try:  # python 3
    from email.mime.text import MIMEText
except ImportError:  # python 2?
    from email.MIMEText import MIMEText

from pytest_localserver import plugin, smtp


def send_plain_email(to, from_, subject, txt, server=('localhost', 25)):
    """
    Sends a simple plain text message via SMTP.
    """
    if type(to) in (tuple, list):
        to = ', '.join(to)

    # Create a text/plain message
    msg = MIMEText(txt)
    msg['Subject'] = subject
    msg['From'] = from_
    msg['To'] = to

    host, port = server[:2]
    server = smtplib.SMTP(host, port)
    server.set_debuglevel(1)
    server.sendmail(from_, to, msg.as_string())
    server.quit()


# define test fixture here again in order to run tests without having to
# install the plugin anew every single time
smtpserver = plugin.smtpserver


def test_smtpserver_funcarg(smtpserver):
    assert isinstance(smtpserver, smtp.Server)
    assert smtpserver.is_alive()
    assert smtpserver.accepting and smtpserver.addr


def test_server_is_killed(smtpserver):
    assert smtpserver.is_alive()
    smtpserver.stop()
    assert not smtpserver.is_alive()


def test_server_is_deleted(smtpserver):
    assert smtpserver.is_alive()
    smtpserver.__del__()  # need to call magic method here!
    assert not smtpserver.is_alive()


def test_smtpserver_has_empty_outbox_at_startup(smtpserver):
    assert len(smtpserver.outbox) == 0


def test_send_email(smtpserver):
    # send one e-mail
    send_plain_email(
        'alice@example.com', 'webmaster@example.com',
        'Your e-mail is getting there', 'Seems like this test actually works!',
        smtpserver.addr)
    msg = smtpserver.outbox[-1]
    assert msg['To'] == 'alice@example.com'
    assert msg['From'] == 'webmaster@example.com'
    assert msg['Subject'] == 'Your e-mail is getting there'
    assert msg.details.rcpttos == ['alice@example.com']
    assert msg.details.peer
    assert msg.details.mailfrom

    # send another e-mail
    send_plain_email(
        'bob@example.com', 'webmaster@example.com',
        'His e-mail too', 'Seems like this test actually works!',
        smtpserver.addr)

    msg = smtpserver.outbox[-1]
    assert msg['To'] == 'bob@example.com'
    assert msg['From'] == 'webmaster@example.com'
    assert msg['Subject'] == 'His e-mail too'

    # two mails are now in outbox
    assert len(smtpserver.outbox) == 2
