# By: Riasat Ullah
# This class accepts a dataframe and allows specific information to be extracted from it.

from utils import constants, var_names
import pandas


class AlertDataFrame(object):

    def __init__(self, alerts):
        self.frame = pandas.DataFrame.from_records(
            alerts, columns=[var_names.event_date, var_names.side, var_names.event_method, var_names.event_type,
                             var_names.instance_id, var_names.organization_id, var_names.user_id,
                             var_names.iso_country_code, var_names.country_code, var_names.phone]
        )

    def get_incident_statistics(self):
        stats = self.frame.groupby(by=[
            var_names.organization_id, var_names.user_id
        ])[var_names.instance_id].nunique().to_dict()
        return stats

    def trigger_count(self, event_method):
        counts = self.frame.loc[
            (self.frame[var_names.event_type] == constants.trigger_event) &
            (self.frame[var_names.event_method] == event_method)] \
            .groupby(by=[var_names.organization_id, var_names.user_id, var_names.iso_country_code])[
            var_names.event_method] \
            .count().to_dict()
        return counts

    def get_billable_alert_statistics(self):
        stats = self.frame.loc[
            (self.frame[var_names.event_method].isin([constants.text, constants.call])) &
            (self.frame[var_names.side] == constants.outgoing_side)
        ].groupby(by=[
            var_names.organization_id, var_names.user_id, var_names.country_code,
            var_names.iso_country_code, var_names.side, var_names.event_method
        ])[var_names.instance_id].count().to_dict()
        return stats
