import time
from aiva.data_integration.metric_stream import MetricStream  # Assuming MetricStream is in the same directory

class TriggerGenerator:
    def __init__(self, thresholds):
        self.thresholds = thresholds  # Dictionary of metric names and their thresholds (e.g., {'cpu_usage': {'max': 80, 'min': 20}})
        self.active_triggers = {}

    def check_thresholds(self, data):
        triggers = []
        for metric_name, value in data.items():
            if metric_name in self.thresholds:
                threshold = self.thresholds[metric_name]

                # Check for maximum threshold breach
                if 'max' in threshold and value > threshold['max']:
                    trigger_id = f"{metric_name}_max_breach"
                    if trigger_id not in self.active_triggers:
                        triggers.append({
                            'trigger_id': trigger_id,
                            'metric': metric_name,
                            'value': value,
                            'threshold': threshold['max'],
                            'type': 'max_breach'
                        })
                        self.active_triggers[trigger_id] = True #activate trigger


                # Check for minimum threshold breach
                if 'min' in threshold and value < threshold['min']:
                    trigger_id = f"{metric_name}_min_breach"
                    if trigger_id not in self.active_triggers:
                        triggers.append({
                            'trigger_id': trigger_id,
                            'metric': metric_name,
                            'value': value,
                            'threshold': threshold['min'],
                            'type': 'min_breach'
                        })
                        self.active_triggers[trigger_id] = True #activate trigger

        return triggers

    def reset_trigger(self, trigger_id):
        if trigger_id in self.active_triggers:
            del self.active_triggers[trigger_id]

if __name__ == '__main__':
    # Example usage
    thresholds = {
        'cpu_usage': {'max': 70, 'min': 30},
        'memory_usage': {'max': 90},
        'network_latency': {'max': 0.5}
    }

    generator = TriggerGenerator(thresholds)

    metrics = {
        'cpu_usage': 50.0,
        'memory_usage': 70.0,
        'network_latency': 0.1
    }

    stream = MetricStream(metrics, interval=0.5)
    stream.start()

    try:
        for _ in range(10):
            data = stream.get_data()
            if data:
                triggers = generator.check_thresholds(data)
                if triggers:
                    for trigger in triggers:
                        print(f"Triggered: {trigger}")

                        # Simulate resetting the trigger after some time
                        #time.sleep(2)
                        #generator.reset_trigger(trigger['trigger_id'])
                        #print(f"Trigger reset: {trigger['trigger_id']}")

                else:
                    print("No triggers.")
            else:
                print("No data received.")
            time.sleep(0.2)
    except KeyboardInterrupt:
        print("Stopping...")
    finally:
        stream.stop()
        print("Stopped.")