from django.core.mail.message import EmailMessage
from django.conf import settings
import os
import datetime

import flowspec.logging_utils
logger = flowspec.logging_utils.logger_init_default(__name__, "flowspec_accounts_view.log", False)

#

def send_new_mail(subject, message, from_email, recipient_list, bcc_list):
  try:
    logger.info("helpers::send_new_mail(): send mail: from_email="+str(from_email)+", recipient_list="+str(recipient_list)+", bcc_list="+str(bcc_list)) 
    return EmailMessage(subject, message, from_email, recipient_list, bcc_list).send()
  except Exception as e:
    #os.write(3, "send_new_mail() failed: exc="+str(e)+"\n") 
    logger.error("helpers::send_new_mail() failed: exc="+str(e)) 

def get_peer_techc_mails(user, peer):
    logger.info("helpers::get_peer_techc_mails(): user="+str(user)+", peer="+str(peer))
    mail = []
    additional_mail = []
    techmails_list = []
    user_mail = '%s' % user.email
    user_mail = user_mail.split(';')
    techmails = []
    if peer:
        techmails = peer.techc_emails.all()
    if techmails:
        for techmail in techmails:
            techmails_list.append(techmail.email)
    if settings.NOTIFY_ADMIN_MAILS:
        additional_mail = settings.NOTIFY_ADMIN_MAILS
    mail.extend(additional_mail)
    mail.extend(techmails_list)
    logger.info("helpers::get_peer_techc_mails(): additional_mail="+str(additional_mail))
    logger.info("helpers::get_peer_techc_mails(): techmails_list="+str(techmails_list))
    return mail

#

admin_error_mail_entry__cache_list = []
max_length_of_entry_message_text__in_digest_mail_text=1000

def handle_admin_error_mail(subject, message):
  try:

    global admin_error_mail_entry__cache_list

    logger.info("helpers::handle_admin_error_mail(): subject='"+str(subject)+"' message='"+str(message)+"'")

    admin_mail_addres_list = ""
    if settings.NOTIFY_ADMIN_MAILS:
      admin_mail_addres_list = settings.NOTIFY_ADMIN_MAILS        
   
    src_addr = settings.SERVER_EMAIL
    #logger.info("helpers::handle_admin_error_mail(): src_addr="+str(src_addr))
    #logger.info("helpers::handle_admin_error_mail(): admin_mail_addres_list="+str(admin_mail_addres_list))

    if admin_mail_addres_list:
      EmailMessage(subject, message, src_addr, admin_mail_addres_list, "").send()
    logger.info("helpers::handle_admin_error_mail(): after mail sending")

    nowtime = datetime.datetime.now()
    #logger.info("helpers::handle_admin_error_mail(): nowtime="+str(nowtime))

    admin_error_mail_entry__cache_list.append({ 'time': nowtime, 'subject': subject, 'message': message })
    #logger.info("helpers::handle_admin_error_mail(): after list append")

    return True

  except Exception as e:
    logger.error("helpers::handle_admin_error_mail() failed: exc="+str(e)) 
    return False

def send_cached_admin_error_entry_summary_ll():
  try:
    
    global admin_error_mail_entry__cache_list

    logger.info("helpers::send_cached_admin_error_entry_summary_ll(): called")

    admin_mail_addres_list = ""
    if settings.NOTIFY_ADMIN_MAILS:
      admin_mail_addres_list = settings.NOTIFY_ADMIN_MAILS        
    
    #

    if len(admin_mail_addres_list)>0:

      subject = 'FoD admin external error summary'
  
      mail_all_text = ''
  
      for entry in admin_error_mail_entry__cache_list:
        nowtime = entry['time']
        subject = entry['subject']
        message = entry['message']
      
        nowstr = nowtime.isoformat()
  
        message_part = str(message)
        if len(message)>max_length_of_entry_message_text__in_digest_mail_text:
            message_part = substr(message, 1, max_length_of_entry_message_text__in_digest_mail_text-4)+' ...' 
  
        mail_all_text = mail_all_text+'\n\n'+str(nowstr)+' '+str(subject)+':\n'+str(message_part)
  
      #
  
      logger.info("helpers::send_cached_admin_error_entry_summary_ll(): => mail_all_text='"+mail_all_text+"'")
  
      if admin_mail_addres_list:
        EmailMessage(subject, mail_all_text, settings.SERVER_EMAIL, admin_mail_addres_list, "").send()
  
      admin_mail_addres_list = [] 

    return True

  except Exception as e:
    logger.error("helpers::send_cached_admin_error_entry_summary_ll(): failed: exc="+str(e)) 
    return False