import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart

class AlertingSystem:
    def __init__(self):
        self.alert_thresholds = {
            "phishing": 0.8,
            "malware": 0.8,
            "anomaly": 0.8
        }
        self.notification_methods = {
            "email": self.send_email,
            "sms": self.send_sms,
            "in_app": self.send_in_app_notification
        }

    def set_alert_threshold(self, alert_type, threshold):
        self.alert_thresholds[alert_type] = threshold

    def get_alert_threshold(self, alert_type):
        return self.alert_thresholds.get(alert_type, 0.8)

    def send_alert(self, alert, method="email"):
        notification_method = self.notification_methods.get(method)
        if notification_method:
            notification_method(alert)
        else:
            print(f"Notification method {method} not supported.")

    def send_email(self, alert):
        sender_email = "your_email@example.com"
        receiver_email = "receiver_email@example.com"
        subject = "Cybersecurity Alert"
        body = f"Alert: {alert}"

        msg = MIMEMultipart()
        msg["From"] = sender_email
        msg["To"] = receiver_email
        msg["Subject"] = subject
        msg.attach(MIMEText(body, "plain"))

        try:
            with smtplib.SMTP("smtp.example.com", 587) as server:
                server.starttls()
                server.login(sender_email, "your_password")
                server.sendmail(sender_email, receiver_email, msg.as_string())
            print("Email sent successfully.")
        except Exception as e:
            print(f"Failed to send email: {e}")

    def send_sms(self, alert):
        # Implement SMS sending logic here
        print(f"SMS Alert: {alert}")

    def send_in_app_notification(self, alert):
        # Implement in-app notification logic here
        print(f"In-app Notification: {alert}")

    def monitor_real_time_data(self, data_stream, model_name, analyze_text):
        for data in data_stream:
            result = analyze_text(data, model_name)
            if result["score"] >= self.get_alert_threshold(model_name):
                self.send_alert(result)

    def customize_notification_method(self, method, custom_function):
        self.notification_methods[method] = custom_function

    def get_notification_methods(self):
        return list(self.notification_methods.keys())