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

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


user_role_maps = {
    static_vars.admin_role: lbl.usr_admin,
    static_vars.limited_stakeholder_role: lbl.usr_limited_stakeholder,
    static_vars.limited_user_role: lbl.usr_limited_user,
    static_vars.manager_role: lbl.usr_manager,
    static_vars.observer_role: lbl.usr_observer,
    static_vars.owner_role: lbl.usr_owner,
    static_vars.responder_role: lbl.usr_responder,
    static_vars.restricted_access_role: lbl.usr_restricted_access,
    static_vars.stakeholder_role: lbl.usr_stakeholder,
    static_vars.user_role: lbl.usr_user
}

team_roles = [static_vars.observer_role, static_vars.responder_role, static_vars.manager_role]

advanced_component_roles = [static_vars.observer_role, static_vars.responder_role, static_vars.manager_role]


def get_user_roles_content(allowed_roles, context, skip_owner=False):
    '''
    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
    :param skip_owner: (boolean) True if the owner role should be skipped; False otherwise
    :return: (dict) user roles dict content
    '''
    roles_content = []
    for item in allowed_roles:
        if skip_owner and item == static_vars.owner_role:
            continue
        else:
            roles_content.append({var_names.name: context[user_role_maps[item]], var_names.field_value: item})
    return roles_content


def get_team_roles_content(context):
    '''
    Gets the user team role options to show during role changes.
    :param context: (dict) translated context
    :return: (dict) team roles dict content
    '''
    roles_content = []
    for item in team_roles:
        roles_content.append({var_names.name: context[user_role_maps[item]], var_names.field_value: item})
    return roles_content


def get_advanced_component_roles_content(context):
    '''
    Gets the user team role options to show during role changes.
    :param context: (dict) translated context
    :return: (dict) advanced component roles dict content
    '''
    roles_content = []
    for item in advanced_component_roles:
        roles_content.append({var_names.name: context[user_role_maps[item]], var_names.field_value: item})
    return roles_content


def get_user_list_context(lang, allowed_components):
    '''
    Context for user list page.
    '''
    top_bar_context = components_context.get_dashboard_topbar_context(lang, allowed_components)

    page_labels = [lbl.desc_users_add_csv_file_upload, lbl.det_assign_to, lbl.det_file_import_completed, lbl.det_name, 
                   lbl.det_role, lbl.det_title, lbl.dsm_search, lbl.err_file_upload, lbl.err_invalid_email, lbl.err_invalid_rows,
                   lbl.ins_add, lbl.ins_cancel, lbl.ins_delete, lbl.ins_edit,lbl.ins_no, lbl.ins_transfer_roles_and_delete_user, 
                   lbl.ins_unlock, lbl.ins_update, lbl.ins_upload_file,lbl.ins_yes, lbl.msg_user_locked, lbl.msg_user_request_sent,
                   lbl.qqs_are_you_sure_you_want_to_delete_this_user,lbl.qqs_are_you_sure_you_want_to_unlock_this_user, 
                   lbl.res_resources, lbl.ttl_account_role,lbl.ttl_delete_user, lbl.ttl_email, lbl.ttl_new_role, 
                   lbl.ttl_new_user, lbl.ttl_preferred_username,lbl.ttl_requested_users, lbl.ttl_request_new_user, 
                   lbl.ttl_team_role, lbl.ttl_transfer_roles,lbl.ttl_users, lbl.ttl_warning]

    user_role_labels = list(user_role_maps.values())

    res_labels = [lbl.res_user_roles, lbl.res_advanced_permissions, lbl.res_business_service_subscriptions,
                  lbl.res_creating_teams, lbl.res_editing_team_member_roles, lbl.res_transfer_ownership]
    page_labels = page_labels + user_role_labels + res_labels
    page_descriptions = [lbl.desc_users, lbl.desc_users_delete_warning, lbl.desc_users_transfer_role,
                         lbl.err_deleting_user_role_transfer]

    final_context = {**top_bar_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_user_profile_context(lang, allowed_components):
    '''
    Context for user profile page.
    '''
    top_bar_context = components_context.get_dashboard_topbar_context(lang, allowed_components)

    page_labels = [lbl.det_choose_theme_or_picture, lbl.det_group, lbl.det_hand_off, lbl.det_language, lbl.det_name,
                   lbl.det_password, lbl.det_phone, lbl.det_re_type_password, lbl.det_role, lbl.det_routine,
                   lbl.det_select_incident_urgency_for_notification_rule, lbl.det_service, lbl.det_sms, lbl.det_title,
                   lbl.det_urgency, lbl.dsm_minutes_after_incident_occurs_notify_by,
                   lbl.dsm_minutes_before_going_on_call_notify_by, lbl.err_file_too_big, lbl.err_invalid_request,
                   lbl.err_password_invalid, lbl.err_password_mismatch, lbl.err_org_owner_removal,
                   lbl.err_phone_number_invalid, lbl.err_user_profile_image_format, lbl.err_user_required_details,
                   lbl.ins_add, lbl.ins_edit, lbl.ins_cancel, lbl.ins_reset, lbl.ins_save, lbl.ins_upload_image,
                   lbl.ins_verify, lbl.opt_critical, lbl.opt_high, lbl.opt_low, lbl.opt_medium, lbl.opt_minor,
                   lbl.res_resources, lbl.ttl_add_remove_tag, lbl.ttl_add_rule, lbl.ttl_alert_notification_rules,
                   lbl.ttl_business_subscriptions, lbl.ttl_component_permissions, lbl.ttl_component_type,
                   lbl.ttl_details, lbl.ttl_email, lbl.ttl_escalation_policy, lbl.ttl_escalation_policies,
                   lbl.ttl_first_name, lbl.ttl_groups, lbl.ttl_incidents, lbl.ttl_last_name,
                   lbl.ttl_hand_off_notification_rules, lbl.ttl_new_alert_notification_rule, lbl.ttl_on_call_shifts,
                   lbl.ttl_phone_call, lbl.ttl_new_hand_off_notification_rule, lbl.ttl_notification_rules,
                   lbl.ttl_personal_information, lbl.ttl_preferred_username, lbl.ttl_profile_picture,
                   lbl.ttl_push_notification, lbl.ttl_routines, lbl.ttl_reset_password, lbl.ttl_services,
                   lbl.ttl_taskcall_email, lbl.ttl_timezone, lbl.ttl_user_profile, lbl.ttl_user_settings,
                   lbl.ttl_verification]

    user_role_labels = list(user_role_maps.values())
    user_lang_labels = list(components_context.language_maps.values())

    res_labels = [lbl.res_user_roles, lbl.res_advanced_permissions, lbl.res_business_service_subscriptions,
                  lbl.res_creating_teams, lbl.res_editing_team_member_roles, lbl.res_transfer_ownership]

    page_labels = page_labels + user_role_labels + user_lang_labels + res_labels
    page_descriptions = [lbl.desc_verification_code_sent, lbl.err_save_alert_notification,
                         lbl.err_save_hand_off_notification]

    final_context = {**top_bar_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_user_business_service_subscriptions_context(lang, allowed_components):
    '''
    Context for the business service details page - both new and edit.
    '''
    top_bar_context = components_context.get_dashboard_topbar_context(lang, allowed_components)

    page_labels = [lbl.det_select_the_business_services_you_want_to_subscribe_to, lbl.ins_done,
                   lbl.ttl_business_service_subscriptions, lbl.ttl_business_services, lbl.ttl_business_subscriptions,
                   lbl.ttl_users, lbl.ttl_user_profile]

    page_descriptions = [lbl.desc_business_service_subscriptions]

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


def get_user_on_call_shifts_context(lang, allowed_components):
    '''
    Context for user on-call shifts 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_assign_to, lbl.det_copied, lbl.det_copy_webcal_url, lbl.det_duration, lbl.det_ends_on,
                   lbl.det_from, lbl.det_level, lbl.det_starts_on, lbl.det_to, lbl.dsm_hours,
                   lbl.err_invalid_request, lbl.err_on_call_shift_override, lbl.err_select_at_least_one_assignee,
                   lbl.err_select_at_least_one_shift_to_override, lbl.ins_cancel, lbl.ins_download, lbl.ins_override,
                   lbl.msg_on_call_shifts_overridden, lbl.msg_user_no_on_call_role,
                   lbl.msg_user_no_upcoming_on_call_role, lbl.ttl_current_on_call_roles,
                   lbl.ttl_on_call_shifts, lbl.ttl_timezone, lbl.ttl_upcoming_on_call_roles]

    res_labels = [lbl.res_user_roles, lbl.res_advanced_permissions, lbl.res_business_service_subscriptions,
                  lbl.res_creating_teams, lbl.res_editing_team_member_roles]

    page_labels = page_labels + res_labels

    final_context = {**top_bar_context, **months_days_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
