# aiva/alerting.py

import logging

logger = logging.getLogger(__name__)

class AlertingEngine:
    def __init__(self, resource_monitor, jitter_range=None):
        self.resource_monitor = resource_monitor
        self.jitter_range = jitter_range  # Tuple: (min_jitter, max_jitter)
        self.thresholds = {
            'cpu_usage': 80,  # Default CPU usage threshold
            'memory_usage': 90  # Default memory usage threshold
        }
        self.dynamic_adjustment_factor = 0.05  # Percentage to adjust thresholds

    def check_alerts(self):
        cpu_usage = self.resource_monitor.get_cpu_usage()
        memory_usage = self.resource_monitor.get_memory_usage()

        # Adjust thresholds based on jitter
        adjusted_cpu_threshold = self.adjust_threshold('cpu_usage')
        adjusted_memory_threshold = self.adjust_threshold('memory_usage')

        if cpu_usage > adjusted_cpu_threshold:
            self.trigger_alert(f"CPU Usage High: {cpu_usage:.2f}% > {adjusted_cpu_threshold:.2f}% threshold.")
        if memory_usage > adjusted_memory_threshold:
            self.trigger_alert(f"Memory Usage High: {memory_usage:.2f}% > {adjusted_memory_threshold:.2f}% threshold.")

    def adjust_threshold(self, metric_name):
        threshold = self.thresholds[metric_name]
        if self.jitter_range:
            jitter_impact = (self.jitter_range[1] - self.jitter_range[0]) / 100.0 # Jitter range as a percentage
            adjustment = threshold * jitter_impact * self.dynamic_adjustment_factor
            adjusted_threshold = threshold - adjustment  # Reduce threshold based on jitter
            logger.debug(f"Adjusted {metric_name} threshold from {threshold} to {adjusted_threshold} due to jitter range {self.jitter_range}")
            return adjusted_threshold
        else:
            return threshold

    def trigger_alert(self, message):
        logger.warning(f"ALERT: {message}")
        # Implement alerting logic here (e.g., send email, log to file)
        print(f"ALERT: {message}") # For demonstration purposes

    def set_jitter_range(self, min_jitter, max_jitter):
        if min_jitter >= 0 and max_jitter >= min_jitter:
            self.jitter_range = (min_jitter, max_jitter)
            logger.info(f"Jitter range set to: {self.jitter_range}")
        else:
            logger.error("Invalid jitter range. Ensure min_jitter >= 0 and max_jitter >= min_jitter.")


if __name__ == '__main__':
    # Example Usage (requires a mock ResourceMonitor for testing)
    class MockResourceMonitor:
        def get_cpu_usage(self):
            return 85  # Simulate high CPU usage

        def get_memory_usage(self):
            return 95  # Simulate high memory usage

    resource_monitor = MockResourceMonitor()
    alerting_engine = AlertingEngine(resource_monitor)
    alerting_engine.check_alerts() # Triggers default threshold alerts

    alerting_engine.set_jitter_range(5, 15) # Set Jitter Range between 5% and 15%
    alerting_engine.check_alerts() # Triggers alerts based on adjusted thresholds
