# By: Riasat Ullah
# This file contains functions for sending notifications to status page subscribers.

from notices import status_page_notices
from utils import constants, logging, mail, url_paths, var_names


def send_post_updates_to_subscribers(lang, subscriber_details, page_name, page_url, logo_url, post_timestamp,
                                     event_type, status, post_title, post_message, impacted_business_services):
    '''
    Notify all status page subscribers.
    :param lang: content language
    :param subscriber_details: (list of dict) of details of subscribers
    :param page_name: name of the status page
    :param page_url: URL of the status page
    :param logo_url: URL of the status page's logo
    :param post_timestamp: timestamp when the post was made
    :param event_type: type of post
    :param status: status of the post/incident
    :param post_title: title of the post/incident
    :param post_message: details of the post/incident
    :param impacted_business_services: (list of dict) of impacted business services and their corresponding state
    :return: (dict) of breakdown of all notifications that were sent
    '''
    # Notify email subscribers
    email_subscribers = [x for x in subscriber_details if x[var_names.subscription_type] == constants.email]
    email_messages = []
    email_addresses = []
    for sub in email_subscribers:
        subject, body = status_page_notices.status_page_post_email_content(
            lang, page_name, page_url, logo_url, sub[var_names.subscriber_ref_id], post_timestamp, event_type, status,
            post_title, post_message, impacted_business_services
        )
        email_messages.append({
            var_names.email_subject: subject,
            var_names.email_body: body,
            var_names.email_to: sub[var_names.email]
        })
        email_addresses.append(sub[var_names.email])

    logging.info('Sending post updates to status page email subscribers: ' + str(len(email_messages)))
    mail.AmazonSesBulkDispatcher(email_messages, mail.AmazonSesCredentials()).start()

    final_breakdown = {var_names.email: email_addresses}
    return final_breakdown


def request_confirmation_from_subscribers(lang, subscriber_details, page_name, page_url, logo_url):
    '''
    Notify all status page subscribers.
    :param lang: content language
    :param subscriber_details: (list of dict) of details of subscribers
    :param page_name: name of the status page
    :param page_url: URL of the page
    :param logo_url: URL of the status page's logo
    :return: (dict) of breakdown of all notifications that were sent
    '''
    # Notify email subscribers
    email_subscribers = [x for x in subscriber_details if x[var_names.subscription_type] == constants.email]
    email_messages = []
    email_addresses = []
    for sub in email_subscribers:
        confirmation_url = url_paths.live_status_pages_subscription_confirm_format.format(
                page_url, sub[var_names.subscriber_ref_id])
        cancellation_url = url_paths.live_status_pages_subscription_cancel_format.format(
                page_url, sub[var_names.subscriber_ref_id])

        subject, body = status_page_notices.status_page_subscriber_confirmation_email_content(
            lang, logo_url, page_name, confirmation_url, cancellation_url
        )
        email_messages.append({
            var_names.email_subject: subject,
            var_names.email_body: body,
            var_names.email_to: sub[var_names.email]
        })
        email_addresses.append(sub[var_names.email])

    logging.info('Sending confirmation requests to status page email subscribers: ' + str(len(email_messages)))
    mail.AmazonSesBulkDispatcher(email_messages, mail.AmazonSesCredentials()).start()

    final_breakdown = {var_names.email: email_addresses}
    return final_breakdown
