from django.db import models
import uuid

class UserFCMToken(models.Model):
    """Store user's FCM token for push notifications"""
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    user_id = models.UUIDField()
    fcm_token = models.CharField(max_length=255)  # Changed from TextField to CharField for MySQL 5.7 index compatibility
    device_type = models.CharField(max_length=20, default='mobile')
    is_active = models.BooleanField(default=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    
    class Meta:
        unique_together = ['user_id', 'fcm_token']

class UserPattern(models.Model):
    """ML Model: Stores learned user patterns"""
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    user_id = models.UUIDField()
    question_type = models.CharField(max_length=20)  # Now uses question_type directly
    average_time = models.TimeField()
    variance_minutes = models.IntegerField()
    confidence_score = models.FloatField()
    last_updated = models.DateTimeField(auto_now=True)
    sample_size = models.IntegerField()
    
    class Meta:
        unique_together = ['user_id', 'question_type']

class MLModel(models.Model):
    """ML Model: Stores trained ML models"""
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    user_id = models.UUIDField()
    algorithm_name = models.CharField(max_length=50)
    model_data = models.JSONField()
    accuracy_score = models.FloatField()
    created_at = models.DateTimeField(auto_now_add=True)
    last_trained = models.DateTimeField(auto_now=True)

class AnomalyAlert(models.Model):
    """ML Model: Stores detected anomalies"""
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    user_id = models.UUIDField()
    stamp_id = models.UUIDField()
    question_type = models.CharField(max_length=20)  # Track which type had anomaly
    anomaly_score = models.FloatField()
    algorithm_used = models.CharField(max_length=50)
    severity = models.CharField(max_length=20)
    created_at = models.DateTimeField(auto_now_add=True)

class ScheduledNotification(models.Model):
    """Track scheduled notifications"""
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    user_id = models.UUIDField()
    question_type = models.CharField(max_length=20)
    scheduled_time = models.DateTimeField()
    celery_task_id = models.CharField(max_length=255, null=True, blank=True)
    is_sent = models.BooleanField(default=False)
    sent_at = models.DateTimeField(null=True, blank=True)
    created_at = models.DateTimeField(auto_now_add=True)
    
    class Meta:
        unique_together = ['user_id', 'question_type', 'scheduled_time']


class BurnoutAnalysis(models.Model):
    """Store burnout analysis results"""
    
    SEVERITY_CHOICES = [
        ('low', 'Low'),
        ('medium', 'Medium'),
        ('high', 'High'),
        ('critical', 'Critical'),
    ]
    
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    user_id = models.UUIDField(db_index=True)
    date = models.DateField()
    risk_score = models.FloatField()  # 0-100
    severity = models.CharField(max_length=20, choices=SEVERITY_CHOICES)
    risk_factors = models.JSONField(default=dict)  # Detailed breakdown
    recommendations = models.JSONField(default=list)  # Suggested balances to use
    created_at = models.DateTimeField(auto_now_add=True)
    
    class Meta:
        db_table = 'burnout_analysis'
        ordering = ['-date', '-created_at']
    
    def __str__(self):
        return f"Burnout Analysis for User {self.user_id} on {self.date} - {self.severity}"


class BurnoutNotification(models.Model):
    """Track sent burnout notifications"""
    
    NOTIFICATION_TYPES = [
        ('burnout_alert', 'Burnout Alert'),
        ('balance_suggestion', 'Balance Suggestion'),
        ('recovery_reminder', 'Recovery Reminder'),
    ]
    
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    user_id = models.UUIDField(db_index=True)
    notification_type = models.CharField(max_length=50, choices=NOTIFICATION_TYPES)
    title = models.CharField(max_length=200)
    message = models.TextField()
    risk_score = models.FloatField()
    recommendation = models.JSONField(default=dict)
    is_read = models.BooleanField(default=False)
    sent_at = models.DateTimeField(auto_now_add=True)
    read_at = models.DateTimeField(null=True, blank=True)
    
    class Meta:
        db_table = 'burnout_notifications'
        ordering = ['-sent_at']
    
    def __str__(self):
        return f"Notification for User {self.user_id} - {self.notification_type}"
    
    def mark_as_read(self):
        """Mark notification as read"""
        from django.utils import timezone
        self.is_read = True
        self.read_at = timezone.now()
        self.save()


class ComplianceNotification(models.Model):
    """Store compliance alerts and notifications"""
    
    SEVERITY_CHOICES = [
        ('low', 'Low'),
        ('medium', 'Medium'),
        ('high', 'High'),
        ('critical', 'Critical'),
    ]
    
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    user_id = models.UUIDField(db_index=True)
    alert_type = models.CharField(max_length=50)  # e.g., 'daily_limit', 'break_required', 'consecutive_days'
    severity = models.CharField(max_length=20, choices=SEVERITY_CHOICES)
    title = models.CharField(max_length=200)
    message = models.TextField()
    time_remaining = models.FloatField(null=True, blank=True)  # Hours remaining
    is_read = models.BooleanField(default=False)
    sent_at = models.DateTimeField(auto_now_add=True)
    read_at = models.DateTimeField(null=True, blank=True)
    
    class Meta:
        db_table = 'compliance_notifications'
        ordering = ['-sent_at']
    
    def __str__(self):
        return f"Compliance notification for User {self.user_id} - {self.alert_type}"
    
    def mark_as_read(self):
        """Mark notification as read"""
        from django.utils import timezone
        self.is_read = True
        self.read_at = timezone.now()
        self.save()
