from __future__ import absolute_import

from django.conf import settings
from django.core.mail import EmailMessage
from typing import Any, Mapping, Optional, Text

from zerver.lib.actions import internal_send_message
from zerver.lib.redis_utils import get_redis_client
from zerver.models import get_realm, get_user_profile_by_email, \
    get_realm_by_email_domain, UserProfile, Realm

import time

client = get_redis_client()

def realm_for_email(email):
    # type: (str) -> Optional[Realm]
    try:
        user = get_user_profile_by_email(email)
        return user.realm
    except UserProfile.DoesNotExist:
        pass

    return get_realm_by_email_domain(email)

def has_enough_time_expired_since_last_message(sender_email, min_delay):
    # type: (Text, float) -> bool
    # This function returns a boolean, but it also has the side effect
    # of noting that a new message was received.
    key = 'zilencer:feedback:%s' % (sender_email,)
    t = int(time.time())
    last_time = client.getset(key, t)
    if last_time is None:
        return True
    delay = t - int(last_time)
    return delay > min_delay

def get_ticket_number():
    # type: () -> int
    num_file = '/var/tmp/.feedback-bot-ticket-number'
    try:
        ticket_number = int(open(num_file).read()) + 1
    except Exception:
        ticket_number = 1
    open(num_file, 'w').write('%d' % (ticket_number,))
    return ticket_number

def deliver_feedback_by_zulip(message):
    # type: (Mapping[str, Any]) -> None
    subject = "%s" % (message["sender_email"],)

    if len(subject) > 60:
        subject = subject[:57].rstrip() + "..."

    content = u''
    sender_email = message['sender_email']

    # We generate ticket numbers if it's been more than a few minutes
    # since their last message.  This avoids some noise when people use
    # enter-send.
    need_ticket = has_enough_time_expired_since_last_message(sender_email, 180)

    if need_ticket:
        ticket_number = get_ticket_number()
        content += '\n~~~'
        content += '\nticket Z%03d (@support please ack)' % (ticket_number,)
        content += '\nsender: %s' % (message['sender_full_name'],)
        content += '\nemail: %s' % (sender_email,)
        if 'sender_domain' in message:
            content += '\nrealm: %s' % (message['sender_domain'],)
        content += '\n~~~'
        content += '\n\n'

    content += message['content']

    internal_send_message(realm_for_email("feedback@zulip.com"), "feedback@zulip.com",
                          "stream", settings.FEEDBACK_STREAM, subject, content)

def handle_feedback(event):
    # type: (Mapping[str, Any]) -> None
    if not settings.ENABLE_FEEDBACK:
        return
    if settings.FEEDBACK_EMAIL is not None:
        to_email = settings.FEEDBACK_EMAIL
        subject = "Zulip feedback from %s" % (event["sender_email"],)
        content = event["content"]
        from_email = '"%s" <%s>' % (event["sender_full_name"], settings.ZULIP_ADMINISTRATOR)
        headers = {'Reply-To': '"%s" <%s>' % (event["sender_full_name"], event["sender_email"])}
        msg = EmailMessage(subject, content, from_email, [to_email], headers=headers)
        msg.send()
    if settings.FEEDBACK_STREAM is not None:
        deliver_feedback_by_zulip(event)

@@ -335,35 +335,8 @@
 %0A   
- get_realm_by_email_domain,
  Use
@@ -398,252 +398,8 @@
 ()%0A%0A
-def realm_for_email(email):%0A    # type: (str) -%3E Optional%5BRealm%5D%0A    try:%0A        user = get_user_profile_by_email(email)%0A        return user.realm%0A    except UserProfile.DoesNotExist:%0A        pass%0A%0A    return get_realm_by_email_domain(email)%0A%0A
 def 
@@ -2132,89 +2132,139 @@
     
-internal_send_message(realm_for_email(%22feedback@zulip.com%22), %22feedback@zulip.com%22
+user_profile = get_user_profile_by_email(settings.FEEDBACK_BOT)%0A    internal_send_message(user_profile.realm, settings.FEEDBACK_BOT
 ,%0A  

Remove unnecessary realm_for_email.