# By: Riasat Ullah
# This file contains functions that will generate the context of incidents pages.

from constants import label_names as lbl
from context_manager import components_context, resources_context
from translators import label_translator as lt
from constants import static_vars, var_names


incident_alert_status_maps = {
    static_vars.acknowledged_state: lbl.sts_acknowledged,
    static_vars.cancelled_state: lbl.sts_cancelled,
    static_vars.grouped_state: lbl.sts_grouped,
    static_vars.open_state: lbl.sts_open,
    static_vars.resolved_state: lbl.sts_resolved,
    static_vars.suppressed_state: lbl.sts_suppressed,
    static_vars.triggered_state: lbl.sts_triggered
}


def get_incident_alert_statuses_content(allowed_roles, context):
    '''
    Gets the user role options to show during role changes.
    :param allowed_roles: (list) the roles that are allowed to be displayed as per the organization's permissions
    :param context: (dict) translated context
    :return: (dict) user roles dict content
    '''
    roles_content = []
    for item in allowed_roles:
        roles_content.append({var_names.name: context[incident_alert_status_maps[item]], var_names.field_value: item})
    return roles_content


def get_incident_list_context(lang, allowed_components):
    '''
    Context of incident list page.
    '''
    top_bar_context = components_context.get_dashboard_topbar_context(lang, allowed_components)
    months_days_context = components_context.get_months_days_context(lang)

    page_labels = [lbl.det_all, lbl.det_assigned_to, lbl.det_filter_by_tags, lbl.det_from, lbl.det_integration,
                   lbl.det_level, lbl.det_mine, lbl.det_my_teams, lbl.det_next_alert_in, lbl.det_open, lbl.det_resolved,
                   lbl.det_resolved_on, lbl.det_service, lbl.det_status, lbl.det_to, lbl.det_urgency,
                   lbl.det_your_current_on_call_roles, lbl.det_your_next_on_call_roles, lbl.dsm_acknowledged,
                   lbl.dsm_hour, lbl.dsm_last_30_days, lbl.dsm_mins, lbl.dsm_minutes, lbl.dsm_open, lbl.dsm_page,
                   lbl.dsm_per_page, lbl.dsm_search, lbl.err_no_incidents_were_selected, lbl.err_processing_failed,
                   lbl.err_select_at_least_one_assignee, lbl.ins_done, lbl.ins_no, lbl.ins_set, lbl.ins_show,
                   lbl.ins_yes, lbl.msg_user_no_on_call_role, lbl.msg_user_no_upcoming_on_call_role, lbl.opt_critical,
                   lbl.opt_high, lbl.opt_low, lbl.opt_medium, lbl.opt_minor, lbl.qqs_are_you_sure_you_want_to_escalate,
                   lbl.res_resources, lbl.ttl_acknowledge, lbl.ttl_acknowledged_incidents, lbl.ttl_alerts,
                   lbl.ttl_created_on, lbl.ttl_dashboard, lbl.ttl_details, lbl.ttl_escalate, lbl.ttl_incidents,
                   lbl.ttl_incident_id, lbl.ttl_incident_title, lbl.ttl_new_incident, lbl.ttl_open_incidents,
                   lbl.ttl_pre_scheduled_alerts, lbl.ttl_reassign, lbl.ttl_resolve, lbl.ttl_resolved_incidents,
                   lbl.ttl_snooze]

    incident_status_labels = list(incident_alert_status_maps.values())

    res_labels = [lbl.res_actions_you_can_perform, lbl.res_mobilize_response, lbl.res_business_impact_visibility,
                  lbl.res_notifications_mechanism, lbl.res_how_to_trigger_an_incident, lbl.res_incident_lifecycle,
                  lbl.res_incident_status, lbl.res_pre_scheduled_alerts,
                  lbl.res_special_actions]
    page_labels = page_labels + incident_status_labels + res_labels

    page_descriptions = [lbl.desc_no_alerts_here, lbl.desc_no_incidents_here]

    final_context = {**top_bar_context, **months_days_context, **lt.get_context(page_labels + page_descriptions, lang)}
    final_context[var_names.resource_items] = resources_context.get_resources_content(res_labels, final_context)
    return final_context


def get_incident_details_context(lang, allowed_components):
    '''
    Context of incident details page.
    '''
    top_bar_context = components_context.get_dashboard_topbar_context(lang, allowed_components)
    months_days_context = components_context.get_months_days_context(lang)
    event_types_context = components_context.get_event_types_context(lang)

    page_labels = [lbl.det_all, lbl.det_assigned_to, lbl.det_amend_urgency_to,
                   lbl.det_change_event_incident_time_correlation, lbl.det_change_event_service_correlation,
                   lbl.det_conference_bridge_choose_existing, lbl.det_conference_bridge_manual, lbl.det_depends_on,
                   lbl.det_description, lbl.det_duration, lbl.det_filter_by_tags, lbl.det_integration,
                   lbl.det_last_6_months, lbl.det_number_of_past_incidents_like_this, lbl.det_none, lbl.det_used_by,
                   lbl.det_5_most_similar_past_incidents_like_this, lbl.det_last_7_days, lbl.det_mean_incident_duration,
                   lbl.det_next_alert_in, lbl.det_number_of_past_incidents_like_this, lbl.det_open, lbl.det_resolved,
                   lbl.det_resolved_on, lbl.det_select_incident_to_merge_with, lbl.det_service, lbl.det_snapshots,
                   lbl.det_status, lbl.det_synced_with, lbl.det_urgency, lbl.det_your_current_on_call_roles,
                   lbl.det_your_next_on_call_roles, lbl.dsm_acknowledged, lbl.dsm_hour, lbl.dsm_incidents_like_this,
                   lbl.dsm_by, lbl.dsm_minutes, lbl.dsm_open, lbl.dsm_source, lbl.dsm_type,
                   lbl.err_conference_bridge_details_invalid, lbl.err_conference_bridge_phone_url_invalid,
                   lbl.err_no_items_were_selected, lbl.err_processing_failed, lbl.err_select_at_least_one_assignee,
                   lbl.err_select_at_least_one_workflow, lbl.ins_add, lbl.ins_amend, lbl.ins_create_jira_issue,
                   lbl.ins_done, lbl.ins_edit, lbl.ins_merge, lbl.ins_no, lbl.ins_run, lbl.ins_save, lbl.ins_set,
                   lbl.ins_show, lbl.ins_unmerge, lbl.ins_yes, lbl.opt_critical, lbl.opt_high, lbl.opt_low,
                   lbl.msg_no_similar_ongoing_incidents_found, lbl.msg_workflow_initiated, lbl.opt_medium,
                   lbl.opt_minor, lbl.qqs_are_you_sure_you_want_to_escalate,
                   lbl.qqs_are_you_sure_you_want_to_redact_this_incident, lbl.res_resources, lbl.ttl_acknowledge,
                   lbl.ttl_add_conference_bridge, lbl.ttl_add_responders, lbl.ttl_add_note, lbl.ttl_add_remove_tag,
                   lbl.ttl_alerts, lbl.ttl_amend_urgency, lbl.ttl_call_back, lbl.ttl_conference_bridges,
                   lbl.ttl_conference_url, lbl.ttl_created_on, lbl.ttl_create_postmortem,
                   lbl.ttl_details, lbl.ttl_dial_in_number, lbl.ttl_edit_incident_title, lbl.ttl_escalate,
                   lbl.ttl_impacted_business_services, lbl.ttl_incidents, lbl.ttl_incident_id, lbl.ttl_incident_title,
                   lbl.ttl_merge_incident, lbl.ttl_more, lbl.ttl_new_update, lbl.ttl_notes, lbl.ttl_past_incidents,
                   lbl.ttl_reassign, lbl.ttl_recent_changes, lbl.ttl_redact_incident, lbl.ttl_resolve,
                   lbl.ttl_resolved_by, lbl.ttl_responders, lbl.ttl_run_workflow,
                   lbl.ttl_technical_service_dependencies, lbl.ttl_similar_ongoing_incidents, lbl.ttl_snooze,
                   lbl.ttl_status_updates, lbl.ttl_subscribers, lbl.ttl_tags, lbl.ttl_team, lbl.ttl_timeline,
                   lbl.ttl_unacknowledge, lbl.ttl_vendor_incident_link, lbl.ttl_vendor_url,
                   lbl.ttl_view_dependency_graph, lbl.ttl_voice_messages]

    incident_status_labels = list(incident_alert_status_maps.values())

    res_labels = [lbl.res_actions_you_can_perform, lbl.res_mobilize_response, lbl.res_business_impact_visibility,
                  lbl.res_notifications_mechanism, lbl.res_how_to_trigger_an_incident, lbl.res_incident_lifecycle,
                  lbl.res_incident_status, lbl.res_pre_scheduled_alerts,
                  lbl.res_special_actions]

    page_labels = page_labels + incident_status_labels + res_labels

    final_context = {**top_bar_context, **months_days_context, **event_types_context,
                     **lt.get_context(page_labels, lang)}
    final_context[var_names.resource_items] = resources_context.get_resources_content(res_labels, final_context)
    return final_context


def get_alerts_list_context(lang, allowed_components):
    '''
    Context of incident list page.
    '''
    top_bar_context = components_context.get_dashboard_topbar_context(lang, allowed_components)
    months_days_context = components_context.get_months_days_context(lang)

    page_labels = [lbl.det_all, lbl.det_integration, lbl.det_my_teams, lbl.det_resolved_on, lbl.det_service,
                   lbl.det_status, lbl.det_title, lbl.det_urgency, lbl.dsm_page, lbl.dsm_per_page,
                   lbl.err_processing_failed, lbl.opt_critical, lbl.opt_high, lbl.opt_low, lbl.opt_medium,
                   lbl.opt_minor, lbl.res_resources, lbl.ttl_alerts, lbl.ttl_created_on,
                   lbl.ttl_details, lbl.ttl_incident_id, lbl.ttl_pre_scheduled_alerts]

    incident_status_labels = list(incident_alert_status_maps.values())

    res_labels = [lbl.res_actions_you_can_perform, lbl.res_mobilize_response, lbl.res_business_impact_visibility,
                  lbl.res_notifications_mechanism, lbl.res_how_to_trigger_an_incident, lbl.res_incident_lifecycle,
                  lbl.res_incident_status, lbl.res_pre_scheduled_alerts,
                  lbl.res_special_actions]
    page_labels = page_labels + incident_status_labels + res_labels

    page_descriptions = [lbl.desc_no_alerts_here, lbl.desc_no_incidents_here]

    final_context = {**top_bar_context, **months_days_context, **lt.get_context(page_labels + page_descriptions, lang)}
    final_context[var_names.resource_items] = resources_context.get_resources_content(res_labels, final_context)
    return final_context


def get_pre_scheduled_alerts_context(lang, allowed_components):
    '''
    Context of pre-scheduled alerts.
    '''
    top_bar_context = components_context.get_dashboard_topbar_context(lang, allowed_components)
    months_days_context = components_context.get_months_days_context(lang)

    page_labels = [lbl.det_alert_time, lbl.det_assigned_to, lbl.det_description, lbl.det_repeat_on, lbl.det_starts_on,
                   lbl.det_title, lbl.det_urgency, lbl.ins_delete, lbl.ins_edit, lbl.ins_no, lbl.ins_yes,
                   lbl.opt_critical, lbl.opt_high, lbl.opt_low, lbl.opt_medium, lbl.opt_minor,
                   lbl.qqs_are_you_sure_you_want_to_delete_this_pre_scheduled_alert, lbl.res_resources, lbl.ttl_alerts,
                   lbl.ttl_details, lbl.ttl_new_incident, lbl.ttl_pre_scheduled_alerts, lbl.ttl_timezone]

    res_labels = [lbl.res_pre_scheduled_alerts, lbl.res_actions_you_can_perform, lbl.res_mobilize_response,
                  lbl.res_business_impact_visibility, lbl.res_notifications_mechanism,
                  lbl.res_how_to_trigger_an_incident, lbl.res_incident_lifecycle, lbl.res_incident_status,
                  lbl.res_special_actions]

    page_labels += res_labels

    page_descriptions = [lbl.desc_no_alerts_here, lbl.desc_pre_scheduled_alerts]
    final_context = {**top_bar_context, **months_days_context, **lt.get_context(page_labels + page_descriptions, lang)}
    final_context[var_names.resource_items] = resources_context.get_resources_content(res_labels, final_context)
    return final_context


def get_pre_scheduled_alert_details_context(lang, allowed_components):
    '''
    Context of pre-scheduled alert details/new incident page.
    '''
    top_bar_context = components_context.get_dashboard_topbar_context(lang, allowed_components)
    months_days_context = components_context.get_months_days_context(lang)

    page_labels = [lbl.det_additional_assignees, lbl.det_alert_time, lbl.det_assign_to, lbl.det_description,
                   lbl.det_none, lbl.det_repeat_on, lbl.det_service, lbl.det_starts_on, lbl.det_title,
                   lbl.det_save_alert_and_trigger_later, lbl.det_trigger_incident_immediately, lbl.det_urgency,
                   lbl.ins_cancel, lbl.ins_create, lbl.ins_save, lbl.opt_critical, lbl.opt_high, lbl.opt_low,
                   lbl.opt_medium, lbl.opt_minor, lbl.ttl_alerts, lbl.ttl_details, lbl.ttl_new_incident,
                   lbl.ttl_pre_scheduled_alerts, lbl.ttl_timezone]

    page_descriptions = [lbl.err_pre_scheduled_alert_invalid_assignee, lbl.err_pre_scheduled_alert_invalid_title]

    final_context = {**top_bar_context, **months_days_context, **lt.get_context(page_labels + page_descriptions, lang)}
    return final_context
