from django.conf import settings
from django.db import models
from django.utils import timezone

class PatientProfile(models.Model):
    user = models.OneToOneField(
        settings.AUTH_USER_MODEL, on_delete=models.SET_NULL,
        null=True, blank=True, related_name="patient_profile"
    )
    full_name = models.CharField(max_length=200)
    email = models.EmailField(blank=True)
    phone = models.CharField(max_length=50, blank=True)
    date_of_birth = models.DateField(null=True, blank=True)
    gender = models.CharField(max_length=30, blank=True)
    address = models.TextField(blank=True)

    blood_group = models.CharField(max_length=10, blank=True)
    allergies = models.TextField(blank=True)
    medical_history = models.TextField(blank=True)

    emergency_contact_name = models.CharField(max_length=200, blank=True)
    emergency_contact_phone = models.CharField(max_length=50, blank=True)

    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.full_name or f"Patient {self.pk}"

class Encounter(models.Model):
    patient = models.ForeignKey(PatientProfile, on_delete=models.CASCADE, related_name="encounters")
    created_by = models.ForeignKey(
        settings.AUTH_USER_MODEL, on_delete=models.SET_NULL,
        null=True, blank=True, related_name="emr_encounters"
    )
    visit_datetime = models.DateTimeField(default=timezone.now)
    chief_complaint = models.CharField(max_length=255, blank=True)
    assessment_notes = models.TextField(blank=True)
    plan_notes = models.TextField(blank=True)
    is_closed = models.BooleanField(default=False)

    def __str__(self):
        return f"Encounter #{self.pk} - {self.patient}"

class VitalSign(models.Model):
    encounter = models.ForeignKey(Encounter, on_delete=models.CASCADE, related_name="vitals")
    recorded_by = models.ForeignKey(
        settings.AUTH_USER_MODEL, on_delete=models.SET_NULL,
        null=True, blank=True, related_name="emr_vitals"
    )
    recorded_at = models.DateTimeField(auto_now_add=True)

    temperature_c = models.DecimalField(max_digits=4, decimal_places=1, null=True, blank=True)
    pulse_bpm = models.PositiveIntegerField(null=True, blank=True)
    respiration_rpm = models.PositiveIntegerField(null=True, blank=True)
    systolic_mmHg = models.PositiveIntegerField(null=True, blank=True)
    diastolic_mmHg = models.PositiveIntegerField(null=True, blank=True)
    spo2_percent = models.PositiveIntegerField(null=True, blank=True)
    weight_kg = models.DecimalField(max_digits=6, decimal_places=2, null=True, blank=True)
    height_cm = models.DecimalField(max_digits=6, decimal_places=1, null=True, blank=True)

    notes = models.TextField(blank=True)

    def __str__(self):
        return f"Vitals #{self.pk} ({self.encounter})"

class Diagnosis(models.Model):
    encounter = models.ForeignKey(Encounter, on_delete=models.CASCADE, related_name="diagnoses")
    diagnosed_by = models.ForeignKey(
        settings.AUTH_USER_MODEL, on_delete=models.SET_NULL,
        null=True, blank=True, related_name="emr_diagnoses"
    )
    created_at = models.DateTimeField(auto_now_add=True)

    title = models.CharField(max_length=255)
    icd_code = models.CharField(max_length=30, blank=True)
    notes = models.TextField(blank=True)

    def __str__(self):
        return self.title

class Prescription(models.Model):
    encounter = models.ForeignKey(Encounter, on_delete=models.CASCADE, related_name="prescriptions")
    prescribed_by = models.ForeignKey(
        settings.AUTH_USER_MODEL, on_delete=models.SET_NULL,
        null=True, blank=True, related_name="emr_prescriptions"
    )
    created_at = models.DateTimeField(auto_now_add=True)

    medication_name = models.CharField(max_length=255)
    dosage = models.CharField(max_length=120, blank=True)
    frequency = models.CharField(max_length=120, blank=True)
    duration = models.CharField(max_length=120, blank=True)
    instructions = models.TextField(blank=True)

    is_active = models.BooleanField(default=True)

    def __str__(self):
        return self.medication_name

def lab_upload_to(instance, filename):
    return f"emr/labs/patient_{instance.encounter.patient_id}/encounter_{instance.encounter_id}/{filename}"

class LabResult(models.Model):
    encounter = models.ForeignKey(Encounter, on_delete=models.CASCADE, related_name="lab_results")
    uploaded_by = models.ForeignKey(
        settings.AUTH_USER_MODEL, on_delete=models.SET_NULL,
        null=True, blank=True, related_name="emr_lab_results"
    )
    created_at = models.DateTimeField(auto_now_add=True)

    title = models.CharField(max_length=255)
    result_notes = models.TextField(blank=True)
    file = models.FileField(upload_to=lab_upload_to, blank=True, null=True)

    def __str__(self):
        return self.title

class AuditEvent(models.Model):
    ACTION_CHOICES = [
        ("create", "Create"),
        ("update", "Update"),
        ("delete", "Delete"),
        ("login", "Login"),
        ("logout", "Logout"),
        ("view", "View"),
    ]

    actor = models.ForeignKey(
        settings.AUTH_USER_MODEL, on_delete=models.SET_NULL,
        null=True, blank=True, related_name="emr_audit_events"
    )
    action = models.CharField(max_length=20, choices=ACTION_CHOICES)
    model_label = models.CharField(max_length=120, blank=True)
    object_id = models.CharField(max_length=64, blank=True)
    object_repr = models.CharField(max_length=255, blank=True)
    changes = models.JSONField(default=dict, blank=True)

    ip_address = models.CharField(max_length=64, blank=True, null=True)
    user_agent = models.TextField(blank=True, null=True)

    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        ordering = ["-created_at"]

    def __str__(self):
        return f"{self.action} {self.model_label} {self.object_id}"
