from django.db import models
from django.core.validators import MaxLengthValidator, MinValueValidator, MaxValueValidator
# from django.utils import timezone
from django.contrib.auth.models import User


# Regions
class Region(models.Model):
    name = models.CharField(max_length=100, default='', null=True)
    description = models.TextField(
        max_length=3000, default='',
        null=True, blank=True, validators=[MaxLengthValidator(3000)],
    )
    created_date = models.DateTimeField(auto_now_add=True, null=True, editable=False)
    updated_date = models.DateTimeField(auto_now=True, null=True, editable=False)
    created_by = models.CharField(max_length=255, default='', null=True, blank=True)
    updated_by = models.CharField(max_length=255, default='', null=True, blank=True)

    def __str__(self):
        return self.name if self.name else "No Name"


# Sites
class Site(models.Model):
    name = models.CharField(max_length=100, default='', null=True)
    description = models.TextField(
        max_length=3000, default='',
        null=True, blank=True, validators=[MaxLengthValidator(3000)],
    )
    created_date = models.DateTimeField(auto_now_add=True, null=True, editable=False)
    updated_date = models.DateTimeField(auto_now=True, null=True, editable=False)
    created_by = models.ForeignKey(
        User, null=True, blank=True, 
        on_delete=models.SET_NULL, related_name='site_created_by',
    )
    updated_by = models.ForeignKey(
        User, null=True, blank=True, 
        on_delete=models.SET_NULL, related_name='site_updated_by',
    )

    def __str__(self):
        return self.name if self.name else "No Name"


# Cases : (Trisomie, TDAH, Autisme, IMC...)
class Case(models.Model):
    name = models.CharField(max_length=100, default='', null=True)
    description = models.TextField(
        max_length=3000, default='',
        null=True, blank=True, validators=[MaxLengthValidator(3000)],
    )
    created_date = models.DateTimeField(auto_now_add=True, null=True, editable=False)
    updated_date = models.DateTimeField(auto_now=True, null=True, editable=False)
    created_by = models.CharField(max_length=255, default='', null=True)
    updated_by = models.CharField(max_length=255, default='', null=True)

    def __str__(self):
        return self.name if self.name else "No Name"


# A day hospital is an establishment, or part of an establishment,
# which welcomes patients for a morning, afternoon or even a full day, in order to carry out
class DayHospital(models.Model):
    name = models.CharField(max_length=100, default='', null=True)
    description = models.TextField(
        max_length=3000, default='',
        null=True, blank=True, validators=[MaxLengthValidator(3000)],
    )
    created_date = models.DateTimeField(auto_now_add=True, null=True, editable=False)
    updated_date = models.DateTimeField(auto_now=True, null=True, editable=False)
    created_by = models.CharField(max_length=255, default='', null=True)
    updated_by = models.CharField(max_length=255, default='', null=True)

    def __str__(self):
        return self.name if self.name else "No Name"


# Ambulatory care is care provided by a physician or health service to a patient without hospitalization,
# or for a few hours; In French : "Ambulatoire"
class Outpatient(models.Model):
    name = models.CharField(max_length=100, default='', null=True)
    description = models.TextField(
        max_length=3000, default='',
        null=True, blank=True, validators=[MaxLengthValidator(3000)],
    )
    created_date = models.DateTimeField(auto_now_add=True, null=True, editable=False)
    updated_date = models.DateTimeField(auto_now=True, null=True, editable=False)
    created_by = models.CharField(max_length=255, default='', null=True)
    updated_by = models.CharField(max_length=255, default='', null=True)

    def __str__(self):
        return self.name if self.name else "No Name"


class School(models.Model):
    name = models.CharField(max_length=100, default='', null=True)
    description = models.TextField(
        max_length=3000, default='',
        null=True, blank=True, validators=[MaxLengthValidator(3000)],
    )
    created_date = models.DateTimeField(auto_now_add=True, null=True, editable=False)
    updated_date = models.DateTimeField(auto_now=True, null=True, editable=False)
    created_by = models.CharField(max_length=255, default='', null=True)
    updated_by = models.CharField(max_length=255, default='', null=True)

    def __str__(self):
        return self.name if self.name else "No Name"


class Leisure(models.Model):
    name = models.CharField(max_length=100, default='', null=True)
    description = models.TextField(
        max_length=3000, default='',
        null=True, blank=True, validators=[MaxLengthValidator(3000)],
    )
    created_date = models.DateTimeField(auto_now_add=True, null=True, editable=False)
    updated_date = models.DateTimeField(auto_now=True, null=True, editable=False)
    created_by = models.CharField(max_length=255, default='', null=True)
    updated_by = models.CharField(max_length=255, default='', null=True)

    def __str__(self):
        return self.name if self.name else "No Name"


class IdentifiedAllergy(models.Model):
    name = models.CharField(max_length=100, default='', null=True)
    date = models.DateTimeField(null=True, blank=True)
    description = models.TextField(
        max_length=3000, default='',
        null=True, blank=True, validators=[MaxLengthValidator(3000)],
    )
    created_date = models.DateTimeField(auto_now_add=True, null=True, editable=False)
    updated_date = models.DateTimeField(auto_now=True, null=True, editable=False)
    created_by = models.CharField(max_length=255, default='', null=True)
    updated_by = models.CharField(max_length=255, default='', null=True)

    def __str__(self):
        return self.name if self.name else "No Name"


class IdentifiedPathology(models.Model):
    name = models.CharField(max_length=100, default='', null=True)
    date = models.DateTimeField(null=True, blank=True)
    description = models.TextField(
        max_length=3000, default='',
        null=True, blank=True, validators=[MaxLengthValidator(3000)],
    )
    created_date = models.DateTimeField(auto_now_add=True, null=True, editable=False)
    updated_date = models.DateTimeField(auto_now=True, null=True, editable=False)
    created_by = models.CharField(max_length=255, default='', null=True)
    updated_by = models.CharField(max_length=255, default='', null=True)

    def __str__(self):
        return self.name if self.name else "No Name"


class BaseMedicalHistory(models.Model):
    name = models.CharField(max_length=100, default='', null=True)
    date = models.DateTimeField(null=True, blank=True)
    description = models.TextField(
        max_length=3000, default='',
        null=True, blank=True, validators=[MaxLengthValidator(3000)],
    )
    comment = models.TextField(max_length=3000, default='', null=True)
    created_date = models.DateTimeField(auto_now_add=True, null=True, editable=False)
    updated_date = models.DateTimeField(auto_now=True, null=True, editable=False)
    created_by = models.CharField(max_length=255, default='', null=True)
    updated_by = models.CharField(max_length=255, default='', null=True)

    def __str__(self):
        return self.name if self.name else "No Name"


class SurgicalMedicalHistory(models.Model):
    name = models.CharField(max_length=100, default='', null=True)
    date = models.DateTimeField(null=True, blank=True)
    description = models.TextField(
        max_length=3000, default='',
        null=True, blank=True, validators=[MaxLengthValidator(3000)],
    )
    created_date = models.DateTimeField(auto_now_add=True, null=True, editable=False)
    updated_date = models.DateTimeField(auto_now=True, null=True, editable=False)
    created_by = models.CharField(max_length=255, default='', null=True)
    updated_by = models.CharField(max_length=255, default='', null=True)

    def __str__(self):
        return self.name if self.name else "No Name"


class FamilyMedicalHistory(models.Model):
    name = models.CharField(max_length=100, default='', null=True)
    date = models.DateTimeField(null=True, blank=True)
    description = models.TextField(
        max_length=3000, default='',
        null=True, blank=True, validators=[MaxLengthValidator(3000)],
    )
    created_date = models.DateTimeField(auto_now_add=True, null=True, editable=False)
    updated_date = models.DateTimeField(auto_now=True, null=True, editable=False)
    created_by = models.CharField(max_length=255, default='', null=True)
    updated_by = models.CharField(max_length=255, default='', null=True)

    def __str__(self):
        return self.name if self.name else "No Name"


class SunChild(models.Model):
    first_name = models.CharField(max_length=100, default='', null=True)
    last_name = models.CharField(max_length=35, default='', null=True)
    address = models.CharField(max_length=105, default='', null=True)
    birth_date = models.DateField(null=True)
    phone_number = models.CharField(max_length=35, default='', null=True)
    father_full_name = models.CharField(max_length=100, default='', null=True)
    mother_full_name = models.CharField(max_length=100, default='', null=True)
    comment = models.TextField(max_length=3000, default='', null=True)
    # Additional Information about the child
    region = models.ForeignKey(
        Region, on_delete=models.SET_NULL,
        related_name='child_region', null=True
    )
    cases = models.ManyToManyField(
        Case, related_name='child_cases', blank=True
    )
    day_hospital = models.ForeignKey(
        DayHospital, on_delete=models.SET_NULL,
        related_name='child_day_hospital', null=True
    )
    # Ambulatoire
    outpatient = models.ForeignKey(
        Outpatient, on_delete=models.SET_NULL,
        related_name='child_outpatient', null=True
    )
    school = models.ForeignKey(
        School, on_delete=models.SET_NULL,
        related_name='child_school', null=True
    )
    # Can be many Leisure
    leisure = models.ManyToManyField(
        Leisure, related_name='child_leisure', blank=True
    )
    # Manipulation Information
    created_date = models.DateTimeField(auto_now_add=True, null=True, editable=False)
    updated_date = models.DateTimeField(auto_now=True, null=True, editable=False)
    created_by = models.CharField(max_length=255, default='', null=True)
    updated_by = models.CharField(max_length=255, default='', null=True)

    def __str__(self):
        return f'{self.first_name} {self.last_name}' if self.first_name and self.last_name else "No Name"

    def get_cases(self):
        return ", ".join(str(case) for case in self.cases.all())

    get_cases.short_description = 'Cases'

    def get_leisure(self):
        return ", ".join(str(leisure) for leisure in self.leisure.all())

    get_leisure.short_description = 'Leisure'


class MedicalHistory(models.Model):
    name = models.CharField(max_length=100, default='', null=True)
    sunchild = models.ForeignKey(
        SunChild, on_delete=models.CASCADE, null=True,
        related_name='medical_histories'
    )
    description = models.TextField(
        max_length=3000, default='',
        null=True, blank=True, validators=[MaxLengthValidator(3000)],
    )
    identified_allergies = models.ManyToManyField(
        IdentifiedAllergy, related_name='medical_history_allergies', blank=True
    )
    identified_pathologies = models.ManyToManyField(
        IdentifiedPathology, related_name='medical_history_pathologies', blank=True
    )
    base_medical_histories = models.ManyToManyField(
        BaseMedicalHistory, related_name='medical_history_bases', blank=True
    )
    surgical_medical_histories = models.ManyToManyField(
        SurgicalMedicalHistory, related_name='medical_history_surgeries', blank=True
    )
    family_medical_histories = models.ManyToManyField(
        FamilyMedicalHistory, related_name='medical_history_family', blank=True
    )
    comment = models.TextField(max_length=3000, default='', null=True)
    created_date = models.DateTimeField(auto_now_add=True, null=True, editable=False)
    updated_date = models.DateTimeField(auto_now=True, null=True, editable=False)
    created_by = models.CharField(max_length=255, default='', null=True)
    updated_by = models.CharField(max_length=255, default='', null=True)

    def __str__(self):
        return self.name if self.name else "No Name"


class Speciality(models.Model):
    name = models.CharField(max_length=100, default='', null=True)
    description = models.TextField(
        max_length=3000, default='',
        null=True, blank=True, validators=[MaxLengthValidator(3000)],
    )
    created_date = models.DateTimeField(auto_now_add=True, null=True, editable=False)
    updated_date = models.DateTimeField(auto_now=True, null=True, editable=False)
    created_by = models.CharField(max_length=255, default='', null=True)
    updated_by = models.CharField(max_length=255, default='', null=True)

    def __str__(self):
        return self.name if self.name else "No Name"


class SpecialistReport(models.Model):
    name = models.CharField(max_length=100, default='', null=True)
    sun_child = models.ForeignKey(
        SunChild, null=True, on_delete=models.SET_NULL, related_name='specialist_report',
    )
    made_by = models.ForeignKey(
        User, null=True, on_delete=models.SET_NULL, related_name='specialist_report_made_by',
    )
    speciality = models.ForeignKey(
        Speciality, null=True, on_delete=models.SET_NULL, related_name='specialist_report_speciality',
    )
    comment = models.TextField(max_length=3000, default='', null=True)
    point_of_attention = models.TextField(max_length=3000, default='', null=True)
    created_date = models.DateTimeField(auto_now_add=True, null=True, editable=False)
    updated_date = models.DateTimeField(auto_now=True, null=True, editable=False)
    created_by = models.CharField(max_length=255, default='', null=True)
    updated_by = models.CharField(max_length=255, default='', null=True)

    def __str__(self):
        return self.name if self.name else "No Name"


class AppointmentStatus(models.Model):
    status = models.CharField(max_length=255, null=True, blank=True)

    created_date = models.DateTimeField(auto_now_add=True, null=True, editable=False)
    updated_date = models.DateTimeField(auto_now=True, null=True, editable=False)
    created_by = models.ForeignKey(
        User, null=True, blank=True, 
        on_delete=models.SET_NULL, related_name='appointment_status_created_by',
    )
    updated_by = models.ForeignKey(
        User, null=True, blank=True, 
        on_delete=models.SET_NULL, related_name='appointment_status_updated_by',
    )

    def __str__(self):
        return self.status if self.status else "No Name"


class Appointment(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=255, null=True, blank=True)
    start = models.DateTimeField(null=True, blank=True)
    end = models.DateTimeField(null=True, blank=True)
    comment = models.TextField(max_length=3000, null=True, blank=True)
    specialist = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True)
    sun_child = models.ForeignKey(SunChild, on_delete=models.SET_NULL, null=True, blank=True)
    status = models.ForeignKey(AppointmentStatus, on_delete=models.SET_NULL, null=True, blank=True)
    region = models.ForeignKey(Region, on_delete=models.SET_NULL, null=True, blank=True)
    site = models.ForeignKey(Site, on_delete=models.SET_NULL, null=True, blank=True)
    
    def __str__(self):
        return self.name if self.name else "No Name"


class Events(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=255, null=True, blank=True)
    start = models.DateTimeField(null=True, blank=True)
    end = models.DateTimeField(null=True, blank=True)

    class Meta:
        db_table = 'tblevents'


# For ZAM projects

GENDER_CHOICES = (
    ('M', 'M'),
    ('F', 'F'),
)


class ZamSite(models.Model):
    name = models.CharField(max_length=150, null=True, blank=True)
    comment = models.TextField(max_length=50000, null=True, blank=True)

    created_date = models.DateTimeField(auto_now_add=True, null=True)
    created_by = models.ForeignKey(
        User, on_delete=models.CASCADE, null=True,
        related_name='site_creator'
    )
    updated_date = models.DateTimeField(auto_now=True, null=True, blank=True)
    updated_by = models.ForeignKey(
        User, on_delete=models.CASCADE, null=True, blank=True,
        related_name='site_updater'
    )

    def __str__(self):
        return self.name if self.name else "No data found"


class Service(models.Model):
    name = models.CharField(max_length=150, null=True, blank=True)
    comment = models.TextField(max_length=50000, null=True, blank=True)

    created_date = models.DateTimeField(auto_now_add=True, null=True)
    created_by = models.ForeignKey(
        User, on_delete=models.CASCADE, null=True,
        related_name='service_creator'
    )
    updated_date = models.DateTimeField(auto_now=True, null=True, blank=True)
    updated_by = models.ForeignKey(
        User, on_delete=models.CASCADE, null=True, blank=True,
        related_name='service_updater'
    )

    def __str__(self):
        return self.name if self.name else "No data found"


class Patology(models.Model):
    name = models.CharField(max_length=150, null=True, blank=True)
    comment = models.TextField(max_length=50000, null=True, blank=True)

    created_date = models.DateTimeField(auto_now_add=True, null=True)
    created_by = models.ForeignKey(
        User, on_delete=models.CASCADE, null=True,
        related_name='patology_creator'
    )
    updated_date = models.DateTimeField(auto_now=True, null=True, blank=True)
    updated_by = models.ForeignKey(
        User, on_delete=models.CASCADE, null=True, blank=True,
        related_name='patology_updater'
    )

    def __str__(self):
        return self.name if self.name else "No data found"


# Create your models here.
class TeamMember(models.Model):
    first_name = models.CharField(max_length=150, null=True, blank=True)
    last_name = models.CharField(max_length=150, null=True, blank=True)
    services = models.ManyToManyField(Service, blank=True, related_name='formulaire_service')
    consultation_date = models.DateTimeField(null=True, blank=True)
    phone_number = models.CharField(max_length=150, null=True, blank=True)
    manager_phone_number = models.CharField(max_length=150, null=True, blank=True)
    personal_email = models.CharField(max_length=150, null=True, blank=True)
    manager_email = models.CharField(max_length=150, null=True, blank=True)

    created_date = models.DateTimeField(auto_now_add=True, null=True)
    created_by = models.ForeignKey(
        User, on_delete=models.CASCADE, null=True,
        related_name='formulaire_creator'
    )
    updated_date = models.DateTimeField(auto_now=True, null=True, blank=True)
    updated_by = models.ForeignKey(
        User, on_delete=models.CASCADE, null=True, blank=True,
        related_name='formulaire_updater'
    )

    def __str__(self):
        return self.prenom if self.prenom else "No data found"


class PatientToFollow(models.Model):
    first_name = models.CharField(max_length=150, null=True, blank=True)
    last_name = models.CharField(max_length=150, null=True, blank=True)
    age = models.IntegerField(
        default=0, null=True, blank=True, validators=[MinValueValidator(0), MaxValueValidator(300)])
    gender = models.CharField(max_length=10, choices=GENDER_CHOICES, null=True, blank=True)
    phone_number = models.CharField(max_length=150, null=True, blank=True)
    address = models.CharField(max_length=150, null=True, blank=True)
    consultation_date = models.DateTimeField(null=True, blank=True)
    diagnosis = models.TextField(max_length=50000, null=True, blank=True)
    recommendations = models.TextField(max_length=50000, null=True, blank=True)

    created_date = models.DateTimeField(auto_now_add=True, null=True)
    created_by = models.ForeignKey(
        User, on_delete=models.CASCADE, null=True,
        related_name='patient_a_suivre_creator'
    )
    updated_date = models.DateTimeField(auto_now=True, null=True, blank=True)
    updated_by = models.ForeignKey(
        User, on_delete=models.CASCADE, null=True, blank=True,
        related_name='patient_a_suivre_updater',
    )

    def __str__(self):
        first_name = {self.first_name} if self.first_name else "No First Name"
        last_name = {self.last_name} if self.last_name else "No Last Name"
        full_name = f"{first_name} {last_name}"
        return full_name


class GeneralReport(models.Model):
    sites = models.ManyToManyField(ZamSite, blank=True)
    age_min = models.IntegerField(default=0, blank=True)
    age_max = models.IntegerField(default=0, null=True, blank=True)
    date = models.DateTimeField(null=True, blank=True)
    patologies = models.ManyToManyField(Patology, blank=True)
    number_of_patients_consulted = models.IntegerField(
        default=0, null=True, blank=True, validators=[MinValueValidator(0), MaxValueValidator(50000)],
    )
    number_of_women = models.IntegerField(
        default=0, null=True, blank=True, validators=[MinValueValidator(0), MaxValueValidator(50000)],
    )
    number_of_men = models.IntegerField(
        default=0, null=True, blank=True, validators=[MinValueValidator(0), MaxValueValidator(50000)],
    )
    patient_to_follow = models.ManyToManyField(PatientToFollow, blank=True, related_name='rg_patient_a_suivre')
    diagnosis = models.TextField(max_length=50000, null=True, blank=True)
    referred_patient = models.TextField(max_length=50000, null=True, blank=True)
    recommendations = models.TextField(max_length=50000, null=True, blank=True)

    created_date = models.DateTimeField(auto_now_add=True, null=True)
    created_by = models.ForeignKey(
        User, on_delete=models.CASCADE, null=True,
        related_name='rapport_generale_creator'
    )
    updated_date = models.DateTimeField(auto_now=True, null=True, blank=True)
    updated_by = models.ForeignKey(
        User, on_delete=models.CASCADE, null=True, blank=True,
        related_name='rapport_generale_updater'
    )

    def __str__(self):
        # Return formatted date if it exists, otherwise a default string
        if self.date:
            return format(self.date, 'Y-m-d H:i:s')  # Customize the format as needed
        return "No data found"
