"""
Simulator models for persistent logging of requests.

This module provides models to store:
- Email simulator requests
- SMS simulator requests
- HIS journey events
- Request metadata and responses
"""
from django.db import models
from django.contrib.auth import get_user_model

User = get_user_model()


class HISRequestLog(models.Model):
    """
    Log all HIS (Hospital Information System) requests for tracking and analysis.
    
    Stores requests from:
    - Email simulator
    - SMS simulator
    - HIS journey events
    """
    # Request identification
    request_id = models.AutoField(primary_key=True)
    timestamp = models.DateTimeField(auto_now_add=True, db_index=True)
    
    # Channel identification
    CHANNEL_CHOICES = [
        ('email', 'Email Simulator'),
        ('sms', 'SMS Simulator'),
        ('his_event', 'HIS Journey Event'),
    ]
    channel = models.CharField(
        max_length=20,
        choices=CHANNEL_CHOICES,
        db_index=True
    )
    
    # Request data
    payload = models.JSONField(default=dict, help_text="Full request payload")
    
    # Response data
    status = models.CharField(
        max_length=20,
        db_index=True,
        help_text="Request status: success, failed, partial, sent"
    )
    response_data = models.JSONField(
        default=dict,
        null=True,
        blank=True,
        help_text="Full response from simulator"
    )
    
    # Processing details
    processing_time_ms = models.IntegerField(
        null=True,
        blank=True,
        help_text="Processing time in milliseconds"
    )
    error_message = models.TextField(
        null=True,
        blank=True,
        help_text="Error message if request failed"
    )
    
    # Related objects (when available)
    patient_id = models.CharField(
        max_length=100,
        null=True,
        blank=True,
        db_index=True,
        help_text="Patient MRN when applicable"
    )
    journey_id = models.CharField(
        max_length=100,
        null=True,
        blank=True,
        db_index=True,
        help_text="Journey encounter ID when applicable"
    )
    survey_id = models.CharField(
        max_length=100,
        null=True,
        blank=True,
        db_index=True,
        help_text="Survey ID when applicable"
    )
    hospital_code = models.CharField(
        max_length=50,
        null=True,
        blank=True,
        db_index=True,
        help_text="Hospital code when applicable"
    )
    
    # Email/SMS specific fields
    recipient = models.CharField(
        max_length=255,
        null=True,
        blank=True,
        help_text="Email address or phone number"
    )
    subject = models.CharField(
        max_length=500,
        null=True,
        blank=True,
        help_text="Email subject when applicable"
    )
    message_preview = models.TextField(
        null=True,
        blank=True,
        help_text="First 500 characters of message"
    )
    
    # HIS event specific fields
    event_type = models.CharField(
        max_length=100,
        null=True,
        blank=True,
        db_index=True,
        help_text="HIS event type code"
    )
    visit_type = models.CharField(
        max_length=50,
        null=True,
        blank=True,
        db_index=True,
        help_text="Visit type: opd, inpatient, ems"
    )
    department = models.CharField(
        max_length=100,
        null=True,
        blank=True,
        help_text="Department name"
    )
    
    # Metadata
    ip_address = models.GenericIPAddressField(
        null=True,
        blank=True,
        help_text="Client IP address"
    )
    user_agent = models.TextField(
        null=True,
        blank=True,
        help_text="Client user agent"
    )
    
    class Meta:
        ordering = ['-timestamp']
        indexes = [
            models.Index(fields=['timestamp', 'channel']),
            models.Index(fields=['status', 'timestamp']),
        ]
        verbose_name = "HIS Request Log"
        verbose_name_plural = "HIS Request Logs"
    
    def __str__(self):
        return f"{self.channel.upper()} HIS Request #{self.request_id} - {self.status}"
    
    def get_status_display_with_icon(self):
        """Return status with icon for UI display"""
        icons = {
            'success': '✅',
            'sent': '✅',
            'failed': '❌',
            'partial': '⚠️',
        }
        return f"{icons.get(self.status, '❓')} {self.status.title()}"
    
    def get_summary(self):
        """Return a brief summary of the request"""
        if self.channel == 'email':
            return f"Email to {self.recipient}"
        elif self.channel == 'sms':
            return f"SMS to {self.recipient}"
        elif self.channel == 'his_event':
            return f"Event: {self.event_type}"
        return f"{self.channel} request"
