from django import forms
from django.contrib.auth.models import User
from django.contrib.auth.forms import SetPasswordForm, UserCreationForm
from django.core.validators import (
    MinValueValidator, MaxValueValidator, MaxLengthValidator
)
from childmonitoring.models import (
    DayHospital, Case, School, Region, Leisure, FamilyMedicalHistory, SurgicalMedicalHistory, BaseMedicalHistory,
)
from childmonitoring.models import (
    Outpatient, IdentifiedAllergy, IdentifiedPathology, Speciality, SpecialistReport, SunChild, 
    ### FOr ZAM ###
    Service, PatientToFollow, GeneralReport, TeamMember,
)


class ChangePasswordForm(SetPasswordForm):
    class Meta:
        model = User
        fields = ['new_password1', 'new_password2']
        widgets = {
            'new_password1': forms.HiddenInput(attrs={'class': 'form-control'}),
            'new_password2': forms.HiddenInput(attrs={'class': 'form-control'}),
        }


class ServiceForm(forms.ModelForm):
    class Meta:
        model = Service
        fields = ['name', 'comment']
        widgets = {
            'name': forms.TextInput(attrs={'class': 'form-control'}),
            'comment': forms.Textarea(attrs={'class': 'form-control', 'rows': 10}),
        }
        labels = {
            'name': 'Nom du Service',
            'comment': 'Commentaire',
        }

    def __init__(self, *args, **kwargs):
        super(ServiceForm, self).__init__(*args, **kwargs)
        self.fields['comment'].validators.append(MaxLengthValidator(3000))  # server-side validation


class PatientForm(forms.ModelForm):
    class Meta:
        model = PatientToFollow
        fields = [
            'first_name', 'last_name', 'age', 'gender', 'phone_number', 'address', 'consultation_date',
            'diagnosis', 'recommendations',
        ]
        exclude = ('created_date', 'updated_date', 'created_by', 'updated_by')
        widgets = {
            'first_name': forms.TextInput(attrs={'class': 'form-control'}),
            'last_name': forms.TextInput(attrs={'class': 'form-control'}),
            'age': forms.NumberInput(attrs={'class': 'form-control', 'min': 0}),
            'gender': forms.Select(attrs={'class': 'form-control'}),
            'phone_number': forms.TextInput(attrs={'class': 'form-control'}),
            'address': forms.TextInput(attrs={'class': 'form-control'}),
            'consultation_date': forms.DateInput(attrs={'class': 'form-control', 'type': 'datetime-local'}),
            'diagnosis': forms.Textarea(attrs={'class': 'form-control', 'rows': 10}),
            'recommendations': forms.Textarea(attrs={'class': 'form-control', 'rows': 10}),
        }
        labels = {
            'first_name': 'Prénom',
            'last_name': 'Nom',
            'age': 'Âge',
            'gender': 'Genre',
            'phone_number': 'Numéro de Téléphone',
            'address': 'Adresse',
            'consultation_date': f'Date de Consultation',
            'diagnosis': 'Diagnostic',
            'recommendations': 'Recommandations',
        }

    def __init__(self, *args, **kwargs):
        super(PatientForm, self).__init__(*args, **kwargs)
        self.fields['diagnosis'].validators.append(MaxLengthValidator(3000))  # server-side validation


# General Report
class GeneralReportForm(forms.ModelForm):
    class Meta:
        model = GeneralReport
        fields = [
            'sites', 'age_min', 'age_max', 'date', 'patologies', 'number_of_patients_consulted',
            'number_of_women', 'number_of_men', 'patient_to_follow', 'diagnosis',
            'referred_patient', 'recommendations'
        ]
        exclude = ('created_date', 'updated_date', 'created_by', 'updated_by')
        widgets = {
            'sites': forms.SelectMultiple(attrs={'class': 'form-control'}),
            'age_min': forms.NumberInput(attrs={'class': 'form-control', 'min': 0}),
            'age_max': forms.NumberInput(attrs={'class': 'form-control', 'min': 0}),
            'date': forms.DateInput(attrs={'class': 'form-control', 'type': 'datetime-local'}),
            'patologies': forms.SelectMultiple(attrs={'class': 'form-control'}),
            'number_of_patients_consulted': forms.NumberInput(attrs={'class': 'form-control', 'min': 0}),
            'number_of_women': forms.NumberInput(attrs={'class': 'form-control', 'min': 0}),
            'number_of_men': forms.NumberInput(attrs={'class': 'form-control', 'min': 0}),
            'patient_to_follow': forms.SelectMultiple(attrs={'class': 'form-control'}),
            'diagnosis': forms.Textarea(attrs={'class': 'form-control', 'rows': 10}),
            'referred_patient': forms.Textarea(attrs={'class': 'form-control', 'rows': 10}),
            'recommendations': forms.Textarea(attrs={'class': 'form-control', 'rows': 10}),
        }
        labels = {
            'sites': 'Sites',
            'age_min': 'Âge Min',
            'age_max': 'Âge Max',
            'date': 'Date',
            'patologies': 'Pathologies',
            'number_of_patients_consulted': 'Nombre de Patients Consultés',
            'number_of_women': 'Nombre de Femmes',
            'number_of_men': 'Nombre d\'Hommes',
            'patient_to_follow': 'Patients à Suivre',
            'diagnosis': 'Diagnostic',
            'referred_patient': 'Patient Référé',
            'recommendations': 'Recommandations',
        }

    def __init__(self, *args, **kwargs):
        super(GeneralReportForm, self).__init__(*args, **kwargs)
        self.fields['patologies'].validators.append(MaxLengthValidator(50000))  # server-side validation
        self.fields['diagnosis'].validators.append(MaxLengthValidator(50000))  # server-side validation
        self.fields['referred_patient'].validators.append(MaxLengthValidator(50000))  # server-side validation
        self.fields['recommendations'].validators.append(MaxLengthValidator(50000))  # server-side validation


class TeamMemberForm(forms.ModelForm):
    class Meta:
        model = TeamMember
        fields = [
            'first_name', 'last_name', 'services', 'consultation_date',
            'phone_number', 'manager_phone_number', 'personal_email', 'manager_email'
        ]
        widgets = {
            'services': forms.SelectMultiple(attrs={'class': 'form-control'}),
            'consultation_date': forms.DateTimeInput(attrs={'class': 'form-control', 'type': 'datetime-local'}),
            'phone_number': forms.TextInput(attrs={'class': 'form-control'}),
            'manager_phone_number': forms.TextInput(attrs={'class': 'form-control'}),
            'personal_email': forms.EmailInput(attrs={'class': 'form-control'}),
            'manager_email': forms.EmailInput(attrs={'class': 'form-control'}),
        }
        labels = {
            'first_name': 'Prénom',
            'last_name': 'Nom',
            'services': 'Services',
            'consultation_date': 'Date de Consultation',
            'phone_number': 'Numéro de Téléphone',
            'manager_phone_number': 'Numéro de Téléphone du Responsable',
            'personal_email': 'Email Personnel',
            'manager_email': 'Email du Responsable',
        }


class CaseForm(forms.ModelForm):
    class Meta:
        model = Case
        exclude = ('creation_date', 'updated_date', 'created_by', 'updated_by')
        fields = ('name', 'description')
        widgets = {
            'name': forms.TextInput(attrs={'class': 'form-control'}),
            'description': forms.Textarea(attrs={'class': 'form-control'}),
        }

    def __init__(self, *args, **kwargs):
        super(CaseForm, self).__init__(*args, **kwargs)
        self.fields['description'].validators.append(MaxLengthValidator(3000))  # server-side validation


class DayHospitalForm(forms.ModelForm):
    class Meta:
        model = DayHospital
        exclude = ('creation_date', 'updated_date', 'created_by', 'updated_by')
        fields = ('name', 'description')
        widgets = {
            'name': forms.TextInput(attrs={'class': 'form-control'}),
            'description': forms.Textarea(attrs={'class': 'form-control'}),
        }

    def __init__(self, *args, **kwargs):
        super(DayHospitalForm, self).__init__(*args, **kwargs)
        self.fields['description'].validators.append(MaxLengthValidator(3000))  # server-side validation


class OutpatientForm(forms.ModelForm):
    class Meta:
        model = Outpatient
        exclude = ('creation_date', 'updated_date', 'created_by', 'updated_by')
        include = ('name', 'description')
        widget = {
            'name': forms.TextInput(attrs={'class': 'form-control'}),
            'description': forms.Textarea(attrs={'class': 'form-control'}),
        }

    def __init__(self, *args, **kwargs):
        super(OutpatientForm, self).__init__(*args, **kwargs)
        self.fields['description'].validators.append(MaxLengthValidator(3000))  # server-side validation


class SchoolForm(forms.ModelForm):
    class Meta:
        model = School
        exclude = ('creation_date', 'updated_date', 'created_by', 'updated_by')
        fields = ('name', 'description')
        widgets = {
            'name': forms.TextInput(attrs={'class': 'form-control'}),
            'description': forms.Textarea(attrs={'class': 'form-control'}),
        }

    def __init__(self, *args, **kwargs):
        super(SchoolForm, self).__init__(*args, **kwargs)
        self.fields['description'].validators.append(MaxLengthValidator(3000))  # server-side validation


class RegionForm(forms.ModelForm):
    class Meta:
        model = Region
        exclude = ('creation_date', 'updated_date', 'created_by', 'updated_by')
        fields = ('name', 'description')
        widgets = {
            'name': forms.TextInput(attrs={'class': 'form-control'}),
            'description': forms.Textarea(attrs={'class': 'form-control'}),
        }

    def __init__(self, *args, **kwargs):
        super(RegionForm, self).__init__(*args, **kwargs)
        self.fields['description'].validators.append(MaxLengthValidator(3000))  # server-side validation


class LeisureForm(forms.ModelForm):
    class Meta:
        model = Leisure
        exclude = ('creation_date', 'updated_date', 'created_by', 'updated_by')
        fields = ('name', 'description')
        widgets = {
            'name': forms.TextInput(attrs={'class': 'form-control'}),
            'description': forms.Textarea(attrs={'class': 'form-control'}),
        }

    def __init__(self, *args, **kwargs):
        super(LeisureForm, self).__init__(*args, **kwargs)
        self.fields['description'].validators.append(MaxLengthValidator(3000))  # server-side validation


class SurgicalMedicalHistoryForm(forms.ModelForm):
    class Meta:
        model = SurgicalMedicalHistory
        exclude = ('creation_date', 'updated_date', 'created_by', 'updated_by')
        fields = ('name',)
        widgets = {
            'name': forms.TextInput(attrs={'class': 'form-control'}),
        }


class FamilyMedicalHistoryForm(forms.ModelForm):
    class Meta:
        model = FamilyMedicalHistory
        exclude = ('creation_date', 'updated_date', 'created_by', 'updated_by')
        fields = ('name',)
        widgets = {
            'name': forms.TextInput(attrs={'class': 'form-control'}),
        }


class BaseMedicalHistoryForm(forms.ModelForm):
    class Meta:
        model = BaseMedicalHistory
        exclude = ('creation_date', 'updated_date', 'created_by', 'updated_by')
        fields = ('name',)
        widgets = {
            'name': forms.TextInput(attrs={'class': 'form-control'}),
        }


class IdentifiedAllergyForm(forms.ModelForm):
    class Meta:
        model = IdentifiedAllergy
        exclude = ('creation_date', 'updated_date', 'created_by', 'updated_by')
        fields = ('name',)
        widgets = {
            'name': forms.TextInput(attrs={'class': 'form-control'}),
        }


class IdentifiedPathologyForm(forms.ModelForm):
    class Meta:
        model = IdentifiedPathology
        exclude = ('creation_date', 'updated_date', 'created_by', 'updated_by')
        fields = ('name',)
        widgets = {
            'name': forms.TextInput(attrs={'class': 'form-control'}),
        }


class SpecialityForm(forms.ModelForm):
    class Meta:
        model = Speciality
        exclude = ('creation_date', 'updated_date', 'created_by', 'updated_by')
        fields = ('name',)
        widgets = {
            'name': forms.TextInput(attrs={'class': 'form-control'}),
        }


class SpecialistReportForm(forms.ModelForm):
    class Meta:
        model = SpecialistReport
        exclude = ('creation_date', 'updated_date', 'created_by', 'updated_by')
        fields = ('name',)
        widgets = {
            'name': forms.TextInput(attrs={'class': 'form-control'})
        }


class SunChildForm(forms.ModelForm):
    class Meta:
        model = SunChild
        exclude = ('created_date', 'updated_date', 'created_by', 'updated_by')
        fields = (
            'first_name', 'last_name', 'address', 'birth_date', 'phone_number',
            'father_full_name', 'mother_full_name', 'comment', 'region',
            'cases', 'day_hospital', 'outpatient', 'school', 'leisure'
        )
        widgets = {
            'first_name': forms.TextInput(attrs={'class': 'form-control'}),
            'last_name': forms.TextInput(attrs={'class': 'form-control'}),
            'address': forms.TextInput(attrs={'class': 'form-control'}),
            'birth_date': forms.DateInput(attrs={'class': 'form-control', 'type': 'date'}),
            'phone_number': forms.TextInput(attrs={'class': 'form-control'}),
            'father_full_name': forms.TextInput(attrs={'class': 'form-control'}),
            'mother_full_name': forms.TextInput(attrs={'class': 'form-control'}),
            'comment': forms.Textarea(attrs={'class': 'form-control'}),
            'region': forms.Select(attrs={'class': 'form-control'}),
            'cases': forms.SelectMultiple(attrs={'class': 'form-control'}),
            'day_hospital': forms.Select(attrs={'class': 'form-control'}),
            'outpatient': forms.Select(attrs={'class': 'form-control'}),
            'school': forms.Select(attrs={'class': 'form-control'}),
            'leisure': forms.SelectMultiple(attrs={'class': 'form-control'}),
        }
