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

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


def get_aggregate_notifications_context(lang, allowed_components):
    '''
    Context for the aggregate notifications analytics 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_date, lbl.det_phone, lbl.det_push, lbl.det_sms, lbl.det_total, lbl.ins_render, lbl.ins_view,
                   lbl.ttl_analytics, lbl.ttl_email, lbl.ttl_notification_analytics]

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


def get_day_notifications_context(lang, allowed_components):
    '''
    Context for the day notifications analytics 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_time, lbl.det_phone, lbl.det_push, lbl.det_sms, lbl.ttl_address, lbl.ttl_analytics,
                   lbl.ttl_details, lbl.ttl_email, lbl.ttl_notification_analytics, lbl.ttl_notification_type,
                   lbl.ttl_user]

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


def get_postmortem_list_context(lang, allowed_components):
    '''
    Context for the postmortem 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_closed, lbl.det_draft, lbl.det_in_review, lbl.det_reviewed, lbl.det_status,
                   lbl.ins_view, lbl.res_resources, lbl.ttl_analytics, lbl.ttl_created_by, lbl.ttl_created_on,
                   lbl.ttl_incident_time, lbl.ttl_postmortem, lbl.ttl_report, lbl.ttl_report_name]

    res_labels = [lbl.res_how_to_trigger_an_incident, lbl.res_notifications_mechanism,
                  lbl.res_actions_you_can_perform]
    page_labels += res_labels

    page_descriptions = [lbl.desc_analytics_postmortem, lbl.desc_no_postmortems_created]

    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_postmortem_report_context(lang, allowed_components):
    '''
    Context for the postmortem report 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_closed, lbl.det_collaborator, lbl.det_date, lbl.det_description, lbl.det_draft,
                   lbl.det_duration, lbl.det_impact, lbl.det_in_review, lbl.det_overview,
                   lbl.det_preventions_from_future_occurrences, lbl.det_resolution, lbl.det_reviewed, lbl.det_reviewer,
                   lbl.det_reviewers_and_collaborators, lbl.det_role, lbl.det_saved, lbl.det_time, lbl.det_urgency,
                   lbl.dsm_hour, lbl.dsm_hours, lbl.dsm_include_incident_details_as_an_appendix, lbl.dsm_mins,
                   lbl.dsm_select_role, lbl.err_postmortem_download, lbl.err_postmortem_duplicate_reviewer,
                   lbl.err_postmortem_name, lbl.ins_add, lbl.ins_comment, lbl.ins_delete, lbl.ins_download_pdf,
                   lbl.ins_edit, lbl.ins_go_back, lbl.ins_no, lbl.ins_save, lbl.ins_view, 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_postmortem, lbl.qqs_what_actions_should_be_taken,
                   lbl.qqs_what_caused_the_incident, lbl.qqs_what_could_have_been_done_better,
                   lbl.qqs_what_was_handled_well, lbl.ttl_analytics, lbl.ttl_comments, lbl.ttl_complete_by,
                   lbl.ttl_created_by, lbl.ttl_created_on, lbl.ttl_details, lbl.ttl_incident, lbl.ttl_incident_status,
                   lbl.ttl_incident_time, lbl.ttl_incident_title, lbl.ttl_postmortem, lbl.ttl_report,
                   lbl.ttl_report_name, lbl.ttl_report_number, lbl.ttl_report_status, lbl.ttl_review,
                   lbl.ttl_review_sessions, lbl.ttl_timeline, lbl.ttl_user]

    incident_status_labels = list(incidents_context.incident_alert_status_maps.values())

    page_labels += incident_status_labels

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


def get_postmortem_template_context(lang):
    '''
    Context for the postmortem downloadable template.
    '''
    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_closed, lbl.det_collaborator, lbl.det_date, lbl.det_description, lbl.det_draft,
                   lbl.det_duration, lbl.det_impact, lbl.det_in_review, lbl.det_opened_on, lbl.det_overview,
                   lbl.det_preventions_from_future_occurrences, lbl.det_resolution, lbl.det_reviewed, lbl.det_reviewer,
                   lbl.det_reviewers_and_collaborators, lbl.det_role, lbl.det_time, lbl.det_urgency,
                   lbl.dsm_hour, lbl.dsm_hours, lbl.dsm_include_incident_details_as_an_appendix, lbl.dsm_mins,
                   lbl.dsm_select_role, lbl.err_postmortem_download, lbl.err_postmortem_duplicate_reviewer,
                   lbl.err_postmortem_name, lbl.ins_add, lbl.ins_comment, lbl.ins_delete, lbl.ins_download_pdf,
                   lbl.ins_edit, lbl.ins_go_back, lbl.ins_no, lbl.ins_save, lbl.ins_view, 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_postmortem, lbl.qqs_what_actions_should_be_taken,
                   lbl.qqs_what_caused_the_incident, lbl.qqs_what_could_have_been_done_better,
                   lbl.qqs_what_was_handled_well, lbl.ttl_analytics, lbl.ttl_comments, lbl.ttl_complete_by,
                   lbl.ttl_created_by, lbl.ttl_created_on, lbl.ttl_details, lbl.ttl_incident, lbl.ttl_incident_status,
                   lbl.ttl_incident_time, lbl.ttl_incident_title, lbl.ttl_postmortem, lbl.ttl_postmortem_report,
                   lbl.ttl_report, lbl.ttl_report_name, lbl.ttl_report_number, lbl.ttl_report_status, lbl.ttl_review,
                   lbl.ttl_review_sessions, lbl.ttl_timeline, lbl.ttl_user]

    incident_status_labels = list(incidents_context.incident_alert_status_maps.values())

    page_labels += incident_status_labels

    final_context = {**months_days_context, **event_types_context, **lt.get_context(page_labels, lang)}
    return final_context


def get_user_analytics_context(lang, allowed_components):
    '''
    Context for the user analytics page.
    '''
    top_bar_context = components_context.get_dashboard_topbar_context(lang, allowed_components)

    page_labels = [lbl.det_avg, lbl.det_fatigue, lbl.det_from, lbl.det_name, lbl.det_rest, lbl.det_to, lbl.det_weekly,
                   lbl.dsm_below_ideal, lbl.dsm_far_below_ideal, lbl.dsm_hours, lbl.dsm_hours_per_day, lbl.dsm_ideal,
                   lbl.dsm_mins, lbl.ins_render, lbl.ttl_acknowledgement_time, lbl.ttl_after_hours,
                   lbl.ttl_daytime_hours, lbl.ttl_effectiveness, lbl.ttl_fatigued_incident_count,
                   lbl.ttl_hourly_effectiveness, lbl.ttl_incidents, lbl.ttl_incident_assignment_distribution,
                   lbl.ttl_individual, lbl.ttl_interruptions, lbl.ttl_preferred_username,
                   lbl.ttl_regular_incident_count, lbl.ttl_resolution_time, lbl.ttl_responsiveness,
                   lbl.ttl_rest_between_incidents, lbl.ttl_sleep_hours, lbl.ttl_summary, lbl.ttl_tags, lbl.ttl_user,
                   lbl.ttl_user_analytics]

    page_descriptions = [lbl.desc_analytics_users, lbl.err_date_invalid]
    final_context = {**top_bar_context, **lt.get_context(page_labels + page_descriptions, lang)}
    return final_context


def get_incident_analytics_context(lang, allowed_components):
    '''
    Context for incident analytics 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_duration, lbl.det_from, lbl.det_resolved_on, lbl.det_service, lbl.det_to,
                   lbl.det_urgency, lbl.ins_render, lbl.opt_critical, lbl.opt_high, lbl.opt_low, lbl.opt_medium,
                   lbl.opt_minor, lbl.ttl_analytics, lbl.ttl_created_on, lbl.ttl_escalated_incidents,
                   lbl.ttl_escalations, lbl.ttl_escalation_policies, lbl.ttl_incident_analytics, lbl.ttl_incidents,
                   lbl.ttl_incident_title, lbl.ttl_major_incidents, lbl.ttl_mean_acknowledgement_time,
                   lbl.ttl_mean_resolution_time, lbl.ttl_resolved_by, lbl.ttl_services, lbl.ttl_summary, lbl.ttl_tags,
                   lbl.ttl_teams]

    page_descriptions = [lbl.desc_analytics_incidents, lbl.desc_analytics_incidents_chart_axis]
    final_context = {**top_bar_context, **months_days_context, **lt.get_context(page_labels + page_descriptions, lang)}
    return final_context


def get_team_analytics_context(lang, allowed_components):
    '''
    Context for the team analytics 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_aggregate, lbl.det_all, lbl.det_daily, lbl.det_from, lbl.det_to, lbl.det_urgency,
                   lbl.ins_render, lbl.opt_critical, lbl.opt_high, lbl.opt_low, lbl.opt_medium, lbl.opt_minor,
                   lbl.ttl_aggregate_escalations, lbl.ttl_aggregate_incidents, lbl.ttl_aggregate_off_hour_interruptions,
                   lbl.ttl_aggregate_response_effort, lbl.ttl_daily_escalations, lbl.ttl_daily_incidents,
                   lbl.ttl_daily_off_hour_interruptions, lbl.ttl_daily_response_effort, lbl.ttl_tags, lbl.ttl_teams,
                   lbl.ttl_team_analytics]

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


def get_service_analytics_context(lang, allowed_components):
    '''
    Context for the service analytics 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_from, lbl.det_impacted, lbl.det_last_6_periods, lbl.det_no_data_available,
                   lbl.det_service, lbl.det_to, lbl.det_urgency, lbl.ins_render, lbl.opt_critical, lbl.opt_high,
                   lbl.opt_low, lbl.opt_medium, lbl.opt_minor, lbl.ttl_aggregate_response_effort, lbl.ttl_analytics,
                   lbl.ttl_critical_incidents, lbl.ttl_high_urgency_incidents, lbl.ttl_incident, lbl.ttl_incidents,
                   lbl.ttl_longest_business_impacts, lbl.ttl_longest_major_incidents, lbl.ttl_longest_resolution_time,
                   lbl.ttl_loudest_services, lbl.ttl_mean_resolution_time, lbl.ttl_most_business_impacting_services,
                   lbl.ttl_service_analytics, lbl.ttl_tags]

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


def get_business_impact_analytics_context(lang, allowed_components):
    '''
    Context for the business impact analytics 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_business_loss, lbl.det_currency, lbl.det_duration,
                   lbl.det_from, lbl.det_labor_cost, lbl.det_service, lbl.det_to, lbl.det_urgency,
                   lbl.dsm_hour, lbl.ins_render, lbl.opt_critical, lbl.opt_high, lbl.opt_low,
                   lbl.opt_medium, lbl.opt_minor, lbl.ttl_aggregate_response_effort, lbl.ttl_analytics,
                   lbl.ttl_business_downtime, lbl.ttl_business_impact, lbl.ttl_business_impact_analytics,
                   lbl.ttl_business_service, lbl.ttl_costliest_major_incidents, lbl.ttl_created_on,
                   lbl.ttl_downtime, lbl.ttl_impacted_business_services, lbl.ttl_impacted_services,
                   lbl.ttl_impacted_services, lbl.ttl_incident, lbl.ttl_incident_id, lbl.ttl_incidents,
                   lbl.ttl_most_disrupting_services, lbl.ttl_most_impacted_business_services, lbl.ttl_tags,
                   lbl.ttl_teams, lbl.ttl_total_cost, lbl.ttl_total_downtime_cost]

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


def get_live_call_analytics_context(lang, allowed_components):
    '''
    Context for the live call routing analytics 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_answered_by, lbl.det_avg, lbl.det_date, lbl.det_from, lbl.det_routing,
                   lbl.det_service, lbl.det_status, lbl.det_to, lbl.ins_render, lbl.sts_answered, lbl.sts_blocked,
                   lbl.sts_message_left, lbl.sts_no_answer, lbl.sts_outgoing, lbl.sts_suppressed,
                   lbl.ttl_acknowledgement_time, lbl.ttl_analytics, lbl.ttl_answered_calls, lbl.ttl_answer_duration,
                   lbl.ttl_answer_duration, lbl.ttl_calling_cost, lbl.ttl_call_duration, lbl.ttl_call_logs,
                   lbl.ttl_daily_calls, lbl.ttl_forwarding_count, lbl.ttl_hourly_calls, lbl.ttl_incident,
                   lbl.ttl_incoming_calls, lbl.ttl_live_call_analytics, lbl.ttl_missed_calls, lbl.ttl_responsiveness,
                   lbl.ttl_team, lbl.ttl_user, lbl.ttl_user_call_performance]

    page_descriptions = [lbl.desc_analytics_live_calls, lbl.desc_no_results_found]
    final_context = {**top_bar_context, **months_days_context, **lt.get_context(page_labels + page_descriptions, lang)}
    return final_context
