# By: Riasat Ullah
# This file contains all constants and functions that are related to integrations with Grafana.

# payload variables
var_alertname = 'alertname'
var_alerts = 'alerts'
var_dashboard_id = 'dashboardId'
var_eval_matches = 'evalMatches'
var_grafana_folder = 'grafana_folder'
var_group_key = 'groupKey'
var_image_url = 'imageUrl'
var_labels = 'labels'
var_message = 'message'
var_org_id = 'orgId'
var_panel_id = 'panelId'
var_rule_id = 'ruleId'
var_rule_name = 'ruleName'
var_rule_url = 'ruleUrl'
var_state = 'state'
var_tags = 'tags'
var_title = 'title'

# state values
alerting_state = 'alerting'
no_data_state = 'no_data'
paused_state = 'paused'
pending_state = 'pending'
ok_state = 'ok'

# error states
error_states = [alerting_state, no_data_state, paused_state, pending_state]

# generic attribute values (use if attribute missing)
generic_title = 'Alert from Grafana'


def get_alert_grouping_fields(alert_body):
    '''
    Get the alert name and grafana folder values for the alert.
    :param alert_body: (dict) request.data or source_payload
    :return: (list of list) -> [[alert name, grafana folder], ...]
    '''
    alert_grouping_fields = []
    if var_alerts in alert_body and len(alert_body[var_alerts]) > 0:
        for alert in alert_body[var_alerts]:
            if var_labels in alert:
                labels = alert[var_labels]
                if var_alertname in labels and var_grafana_folder in labels:
                    alert_grouping_fields.append([labels[var_alertname], labels[var_grafana_folder]])

    return alert_grouping_fields


def has_matching_grouping_field(first_fields, second_fields):
    '''
    Check if there are any grouping fields that are the same from two lists of grouping fields identified from
    all alerts sent in a Grafana alert payload.
    :param first_fields: (list of list) first list of grouping fields -> [[alert name, grafana folder], ...]
    :param second_fields: (list of list) second list of grouping fields -> [[alert name, grafana folder], ...]
    :return: (boolean) True if a match is found; False otherwise
    '''
    if first_fields is not None and len(first_fields) > 0 and second_fields is not None and len(second_fields) > 0:
        for item_1 in first_fields:
            for item_2 in second_fields:
                if item_1[0] == item_2[0] and item_1[1] == item_2[1]:
                    return True
    return False
