from django.conf import settings
from django.db import models

from userauth import models as userauth_models
# from core.validators import validate_future_date
# from reservation.models import Reservation
from django.core.validators import RegexValidator
from django.utils import timezone
from django.core.exceptions import ValidationError
from datetime import timedelta
from core.models import Service ,PatientService, PatientServiceItem
from doctor.models import Doctor, Technician
import uuid
GENDER = (
    ("Male", "Male"),
    ("Female", "Female"),
    ("None", "None"),
)


def validate_future_date(value):
    from django.utils import timezone
    from django.core.exceptions import ValidationError

    if value > timezone.now().date():
        raise ValidationError("The birth date cant be in future.")
def generate_random_id():
    import random
    return random.randint(100000, 999999)

class Patient(models.Model):
    GENDER = (
        ("Male", "Male"),
        ("Female", "Female"),
        ("None", "None"),
    )
    leader = models.ForeignKey(
        userauth_models.User,
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
        related_name='patient_leader'  # اضافه کردن این خط
    )
    
    # user = models.OneToOneField(
    #     userauth_models.User, 
    #     on_delete=models.CASCADE, 
    #     null=True, 
    #     blank=True,
    #     related_name='patient_user'  # اضافه کردن این خط
    # )
    user = models.OneToOneField(userauth_models.User, on_delete=models.CASCADE, null=True, blank=True)
    first_name = models.CharField(max_length=100, null=True, blank=True)
    last_name = models.CharField(max_length=100, null=True, blank=True)
    wallet = models.DecimalField(default=0,max_digits=10, decimal_places=2,null=True, blank=True)
    phone_number = models.CharField(
        max_length=15,  # Adjust length as necessary
        null=True,
        blank=True,
        validators=[RegexValidator(regex=r'^\d+$', message="Phone number must contain only numeric characters.")]
    )
    country_code = models.CharField(max_length=100,  blank=True)
    date_of_birth = models.DateField(validators=[validate_future_date], null=True, blank=True)
    age = models.IntegerField(null=True, blank=True)
    gender = models.CharField(max_length=8, choices=GENDER, default="None")
    REFERENCETYPES = (
        ("", ""),
        ("Person", "Person"),
        ("SocialMedia", "SocialMedia"),
    )
    reference_type = models.CharField(max_length=18, choices=REFERENCETYPES, default="")
    SOCIAL = (
        ("", ""),
        ("Instagram", "Instagram"),
        ("Telegram", "Telegram"),
        ("WhatsApp", "WhatsApp"),
        ("Viber", "Viber"),
        ("Facebook", "Facebook"),
        ("TikTok", "TikTok"),
        ("Others", "Others"),
    )
    social_media_type = models.CharField(max_length=18, choices=SOCIAL, default="")
    identifier_name = models.CharField(max_length=18, null=True, blank=True)
    identifier_phone = models.CharField(max_length=18, null=True, blank=True)
    address = models.CharField(max_length=100, null=True, blank=True)
    profile_picture = models.ImageField(upload_to="images/patient_profile", null=True, blank=True)
    medical_history = models.TextField(null=True, blank=True)



    identifier = models.IntegerField(default=generate_random_id, null=True, blank=True)
    biography = models.TextField(blank=True, null=True)

    # created_at = models.DateTimeField(auto_now_add=True)  # Add this line
    # created_at = models.DateTimeField(default=timezone.now,blank=True, null=True)  # Add this line
    created_at = models.DateTimeField(auto_now_add=True,null=True, blank=True)

    # @property
    # def has_reservations(self):
    #     return hasattr(self, 'ordered_reservations') and bool(self.ordered_reservations)
    #
    # @property
    # def latest_reservation_date(self):
    #     if self.has_reservations:
    #         return self.ordered_reservations[0].reservation_date
    #     return None
    #
    # @property
    # def latest_reservation_status(self):
    #     if self.has_reservations:
    #         return self.ordered_reservations[0].status
    #     return None


    def __str__(self):
        return self.get_full_name() or f"Patient {self.id}"

    def get_full_name(self):
        return f"{self.first_name or ''} {self.last_name or ''}".strip()

    def get_short_name(self):
        return f"{self.first_name[0] or ''} {self.last_name[0] or ''}".strip()


    def clean(self):
        super().clean()
        if self.phone_number:
            if len(self.phone_number) < 10 or len(self.phone_number) > 15:
                raise ValidationError("Phone number must be between 10 and 15 digits.")

    class Meta:
        ordering = ['id']

class MedicalRecord(models.Model):
    RECORD_TYPE_CHOICES = [
        ('general', 'General'),
        ('diabetes', 'Diabetes'),
        ('hypertension', 'Hypertension'),
        ('pregnancy', 'Pregnancy'),
        ('heart', 'Heart Disease'),
        ('allergy', 'Allergy'),
        ('other', 'Other')
    ]

    STATUS_CHOICES = [
        ('active', 'Active - Under Treatment'),
        ('controlled', 'Controlled'),
        ('recovered', 'Recovered')
    ]

    DIABETES_TYPE_CHOICES = [
        ('', ''),
        ('type1', 'Type 1'),
        ('type2', 'Type 2'),
        ('gestational', 'Gestational')
    ]

    patient = models.ForeignKey(Patient, related_name='medical_records', on_delete=models.CASCADE)
    record_type = models.CharField(max_length=20, choices=RECORD_TYPE_CHOICES)

    # فیلدهای مشترک
    diagnosis_date = models.DateField(null=True, blank=True)
    medications = models.TextField(blank=True, null=True)
    description = models.TextField(blank=True, null=True)
    status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='active')

    # فیلدهای اختصاصی برای انواع مختلف پرونده
    # دیابت
    diabetes_type = models.CharField(max_length=20, choices=DIABETES_TYPE_CHOICES, null=True, blank=True)

    # فشار خون
    blood_pressure = models.CharField(max_length=20, null=True, blank=True)  # مثال: 120/80

    # بارداری
    pregnancy_week = models.PositiveSmallIntegerField(null=True, blank=True)

    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)


    def __str__(self):
        return f"{self.patient.get_full_name()} - {self.get_record_type_display()}"

    def clean(self):
        super().clean()

        # اعتبارسنجی برای نوع دیابت
        if self.record_type == 'diabetes' and not self.diabetes_type:
            raise ValidationError({'diabetes_type': 'Diabetes type is required for diabetes records.'})

        # اعتبارسنجی برای فشار خون
        if self.record_type == 'hypertension' and not self.blood_pressure:
            raise ValidationError({'blood_pressure': 'Blood pressure value is required for hypertension records.'})

        # اعتبارسنجی برای بارداری
        if self.record_type == 'pregnancy' and not self.pregnancy_week:
            raise ValidationError({'pregnancy_week': 'Pregnancy week is required for pregnancy records.'})

        # اعتبارسنجی برای مقدار هفته بارداری
        if self.pregnancy_week is not None and (self.pregnancy_week < 1 or self.pregnancy_week > 42):
            raise ValidationError({'pregnancy_week': 'Pregnancy week must be between 1 and 42.'})

    class Meta:
        ordering = ['-created_at']
class PatientImage(models.Model):
    # patient = models.ForeignKey(Patient, on_delete=models.CASCADE, related_name='images')
    reservation = models.ForeignKey('reservation.Reservation', on_delete=models.CASCADE, blank=True, null=True, related_name='images')
    image = models.ImageField(upload_to='images/patient_gallery/%Y/%m/%d/')
    description = models.CharField(max_length=200, blank=True)
    image_type = models.CharField(max_length=20, choices=[
        ('before', 'Before Treatment'),
        ('after', 'After Treatment'),
        ('during', 'During Treatment'),
        ('other', 'Other')
    ])
    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        ordering = ['-created_at']

    def __str__(self):
        return f"Image {self.id} for {self.reservation.patient.get_full_name()}"

