import os
import uuid
from urllib import parse

from django.core.mail import EmailMultiAlternatives

from django_mailbox.models import Mailbox
from django_mailbox.tests.base import EmailMessageTestCase


__all__ = ['TestImap']


class TestImap(EmailMessageTestCase):
    def setUp(self):
        super().setUp()

        self.test_imap_server = (
            os.environ.get('EMAIL_IMAP_SERVER')
        )

        required_settings = [
            self.test_imap_server,
            self.test_account,
            self.test_password,
            self.test_smtp_server,
            self.test_from_email,
        ]
        if not all(required_settings):
            self.skipTest(
                "Integration tests are not available without having "
                "the the following environment variables set: "
                "EMAIL_ACCOUNT, EMAIL_PASSWORD, EMAIL_SMTP_SERVER, "
                "EMAIL_IMAP_SERVER."
            )

        self.mailbox = Mailbox.objects.create(
            name='Integration Test Imap',
            uri=self.get_connection_string()
        )
        self.arbitrary_identifier = str(uuid.uuid4())

    def get_connection_string(self):
        return "imap+ssl://{account}:{password}@{server}".format(
            account=parse.quote(self.test_account),
            password=parse.quote(self.test_password),
            server=self.test_imap_server,
        )

    def test_get_imap_message(self):
        text_content = 'This is some content'
        msg = EmailMultiAlternatives(
            self.arbitrary_identifier,
            text_content,
            self.test_from_email,
            [
                self.test_account,
            ]
        )
        msg.send()

        messages = self._get_new_messages(
            self.mailbox,
            condition=lambda m: m['subject'] == self.arbitrary_identifier
        )
        message = next(messages)

        self.assertEqual(message.subject, self.arbitrary_identifier)
        self.assertEqual(message.text, text_content)
        self.assertEqual(0, len(list(messages)))
