from django.utils import timezone
from datetime import datetime
from django.contrib.auth import update_session_auth_hash
from django.contrib.auth.decorators import login_required
from django.contrib.auth.forms import UserCreationForm
from django.http import JsonResponse
from django.shortcuts import redirect, render, get_object_or_404
from django.contrib import messages
from django.views.decorators.http import require_http_methods
from .forms import ChangePasswordForm

# Import pagination requirements and addons
from django.core.paginator import Paginator

# Import childmonitoring models
from childmonitoring.models import *
from childmonitoring.forms import (
    SunChildForm, 
    # For ZAM
    ServiceForm, PatientForm, GeneralReportForm, TeamMemberForm,
)

# Import create functions from the create_childmonitoring module
from childmonitoring.functions.create_childmonitoring import *
# Import list functions from the list_childmonitoring module
from childmonitoring.functions.list_childmonitoring import *
# Import details functions from the details_childmonitoring module
from childmonitoring.functions.details_childmonitoring import *
# Import update functions from the update_childmonitoring module
from childmonitoring.functions.update_childmonitoring import *

from childmonitoring.functions.appointment import (
    all_appointments, list_appointments, create_appointment,
)


# def register_user(request):
#     return render(request, 'html/authentication/register-user.html')
#     try:
#         if request.method == 'POST':
#             form = UserCreationForm(request.POST)
#             if form.is_valid():
#                 form.save()
#                 return redirect('login')
#             context = {
#                 'form': form
#             }
#         else:
#             form = UserCreationForm()
#             context = {
#                 'form': form
#             }
#         return render(request, 'registration/register.html', context)
#     except Exception as e:
#         print("Error for creating user", e)


@login_required()
def update_password(request):
    current_user = request.user
    # Did they fill out the form
    if request.method == 'POST':
        form = ChangePasswordForm(current_user, request.POST)
        # Check if the form is valid
        if form.is_valid():
            user = form.save()
            update_session_auth_hash(request, user)
            messages.success(request, "Votre mot de passe a été mis à jour avec succès.")
            return redirect('list_services_view')
        else:
            for error in list(form.errors.values()):
                messages.error(request, error)
    else:
        form = ChangePasswordForm(current_user)

    context = {
        'form': form
    }
    return render(request, 'html/authentication/update-password.html', context)


@login_required
def home(request):
    content = ['1', '2', '3', '4', '5']
    context = {
        "queries": content
    }
    return render(request, 'html/home.html', context)  # Return HttpResponse


def login_view():
    return redirect(home)


# Create for Region
@login_required()
def create_region_view(request):
    form = create_region(request)
    status = request.session.get('status')  # Get the status of the request
    if status == 'success':  # Check the session value
        messages.success(request, 'Région créer avec succès')
        del request.session['status']  # Delete the session value -> None
        return redirect('list_regions_view')
    context = {'form': form}
    return render(request, 'html/regions/create_region.html', context)


# Update for Region
@login_required()
def update_region_view(request, pk):
    form = update_region(request, pk)
    status = request.session.get('status')
    if status == 'success':
        messages.success(request, 'Région mis a jour avec success')
        del request.session['status']
        return redirect('list_regions_view')
    context = {'form': form}
    return render(request, 'html/regions/update_region.html', context)


# List for Region
@login_required()
def list_regions_view(request):
    regions = list_regions()
    context = {
        'regions': regions
    }
    return render(request, 'html/regions/list_regions.html', context)


@login_required()
def details_regions_view(request, pk):
    context = details_region(pk)
    if 'error' in context:
        messages.error(request, "Cette region n'existe pas.")
        return redirect('list_regions_view')
    return render(request, 'html/regions/details_region.html', context)


# Delete for Region
@login_required()
@require_http_methods(["DELETE"])
def delete_region(request, pk):
    regions = get_object_or_404(Region, pk=pk)
    regions.delete()
    return JsonResponse({'success': True})


# Create for Case model
@login_required()
def create_case_view(request):
    form = create_case(request)
    status = request.session.get('status')  # Get the status of the request

    if request.method == 'POST':
        if status == 'success':  # Check the session value
            messages.success(request, 'Cas créer avec succès')
            del request.session['status']  # Delete the session value -> None
            return redirect('list_case_view')
        else:
            messages.error(request, f'Erreur lors de la création')
            del request.session['status']  # Delete the session value -> None
            return redirect('create_case_view')

    context = {'form': form}
    return render(request, 'html/cases/create_case.html', context)


# Update for Case model
@login_required()
def update_case_view(request, pk):
    form = update_case(request, pk)
    status = request.session.get('status')
    if status == 'success':
        messages.success(request, 'Cas mis a jour avec success')
        del request.session['status']
        return redirect('list_case_view')
    context = {'form': form}
    return render(request, 'html/cases/update_case.html', context)


# List for Case
@login_required()
def list_case_view(request):
    cases = list_case()
    context = {
        'cases': cases
    }
    return render(request, 'html/cases/list_case.html', context)


@login_required()
def details_case_view(request, pk):
    context = details_case(pk)
    if 'error' in context:
        messages.error(request, "Cette case n'existe pas.")
        return redirect('list_case_view')
    return render(request, 'html/cases/details_case.html', context)


# Delete for Case
@login_required()
@require_http_methods(["DELETE"])
def case_delete(request, pk):
    case = get_object_or_404(Case, pk=pk)
    case.delete()
    return JsonResponse({'success': True})


# CRUD for Day_Hospital
@login_required()
def list_day_hospital_view(request):
    day_hospitals = list_day_hospitals()
    context = {
        'day_hospitals': day_hospitals
    }
    return render(request, 'html/day_hospital/list_dayHospital.html', context)


# Create for Day_Hospital
@login_required()
def day_hospital_create_view(request):
    form = create_day_hospital(request)
    status = request.session.get('status')  # Get the status of the request

    if request.method == 'POST':
        if status == 'success':  # Check the session value
            messages.success(request, 'Hôpital du jour créer avec succès')
            del request.session['status']  # Delete the session value -> None
            return redirect('list_day_hospital_view')
        else:
            messages.error(request, f'Erreur lors de la création')
            del request.session['status']  # Delete the session value -> None
            return redirect('day_hospital_create_view')

    context = {'form': form}
    return render(request, 'html/day_hospital/create_dayHospital.html', context)


# Update for Day_Hospital
@login_required()
def update_day_hospital_view(request, pk):
    form = update_day_hospital(request, pk)
    status = request.session.get('status')
    if status == 'success':
        messages.success(request, 'Ambulatoire mis a jour avec success')
        del request.session['status']
        return redirect('list_day_hospital_view')
    context = {'form': form}
    return render(request, 'html/day_hospital/update_dayHospital.html', context)


@login_required()
def details_day_hospital_view(request, pk):
    context = details_day_hospital(pk)
    if 'error' in context:
        messages.error(request, "Cet hôpital du jour n'existe pas.")
        return redirect('list_day_hospital_view')
    return render(request, 'html/day_hospital/details_dayHospital.html', context)


# Delete for Day_Hospital
@login_required()
@require_http_methods(["DELETE"])
def day_hospital_delete(request, pk):
    day_hospital = get_object_or_404(DayHospital, pk=pk)
    day_hospital.delete()
    return JsonResponse({'success': True})


# List OutPatients
@login_required()
def list_outpatients_view(request):
    outpatients = list_outpatients()
    context = {
        'outpatients': outpatients
    }
    return render(request, 'html/outpatients/list-outpatients.html', context)


@login_required()
def details_outpatient_view(request, pk):
    context = details_outpatient(pk)
    if 'error' in context:
        messages.error(request, "Cet Ambulatoire du  n'existe pas.")
        return redirect('list_outpatients_view')
    return render(request, 'html/outpatients/details_outpatients.html', context)


# Create OutPatient
@login_required()
def create_outpatient_view(request):
    form = create_outpatient(request)
    status = request.session.get('status')  # Get the status of the request
    if status == 'success':  # Check the session value
        messages.success(request, 'Ambulatoire créer avec succès')
        del request.session['status']  # Delete the session value -> None
        return redirect('list_outpatients_view')

    context = {'form': form}
    return render(request, 'html/outpatients/create-outpatient.html', context)


# Delete for Outpatient
@login_required()
@require_http_methods(["DELETE"])
def delete_outpatient(request, pk):
    outpatient = get_object_or_404(Outpatient, pk=pk)
    outpatient.delete()
    return JsonResponse({'success': True})


# Update for Outpatient
@login_required()
def update_outpatient_view(request, pk):
    form = update_outpatient(request, pk)
    status = request.session.get('status')
    if status == 'success':
        messages.success(request, 'Ambulatoire mis a jour avec success')
        del request.session['status']
        return redirect('list_outpatients_view')
    context = {'form': form}
    return render(request, 'html/outpatients/update_outpatient.html', context)


# List for School
@login_required()
def list_schools_view(request):
    schools = list_schools()
    context = {
        'schools': schools
    }
    return render(request, 'html/schools/list_schools.html', context)


@login_required()
def details_school_view(request, pk):
    context = details_school(pk)
    if 'error' in context:
        messages.error(request, "Cette ecole  n'existe pas.")
        return redirect('list_schools_view')
    return render(request, 'html/schools/details_schools.html', context)


# Create for School
@login_required()
def create_school_view(request):
    form = create_school(request)
    status = request.session.get('status')  # Get the status of the request
    if status == 'success':  # Check the session value
        messages.success(request, 'École créer avec succès')
        del request.session['status']  # Delete the session value -> None
        return redirect('list_schools_view')
    context = {'form': form}
    return render(request, 'html/schools/create_school.html', context)


# Update for School
@login_required()
def update_school_view(request, pk):
    form = update_school(request, pk)
    status = request.session.get('status')
    if status == 'success':
        messages.success(request, 'École mis a jour avec success')
        del request.session['status']
        return redirect('list_schools_view')
    context = {'form': form}
    return render(request, 'html/schools/update_school.html', context)


# Delete for School
@login_required()
@require_http_methods(["DELETE"])
def delete_school(request, pk):
    school = get_object_or_404(School, pk=pk)
    school.delete()
    return JsonResponse({'success': True})


# Create view for Leisure
@login_required()
def create_leisure_view(request):
    form = create_leisure(request)
    status = request.session.get('status')  # Get the status of the request
    if status == 'success':  # Check the session value
        messages.success(request, 'Loisir créer avec succès')
        del request.session['status']  # Delete the session value -> None
        return redirect('list_leisure_view')
    context = {'form': form}
    return render(request, 'html/leisure/create_leisure.html', context)


# list of Leisure
@login_required()
def list_leisure_view(request):
    leisure = list_leisure()
    context = {
        'leisure': leisure
    }
    return render(request, 'html/leisure/list_leisure.html', context)


@login_required()
def details_leisure_view(request, pk):
    context = details_leisure(pk)
    if 'error' in context:
        messages.error(request, "Cette loisir  n'existe pas.")
        return redirect('list_leisure_view')
    return render(request, 'html/leisure/details_leisure.html', context)


# Update for Leisure
@login_required()
def update_leisure_view(request, pk):
    form = update_leisure(request, pk)
    status = request.session.get('status')
    if status == 'success':
        messages.success(request, 'Leisure mis a jour avec success')
        del request.session['status']
        return redirect('list_leisure_view')
    context = {'form': form}
    return render(request, 'html/leisure/update_leisure.html', context)


# Delete for Leisure
@login_required()
@require_http_methods(["DELETE"])
def delete_leisure(request, pk):
    leisure = get_object_or_404(Leisure, pk=pk)
    leisure.delete()
    return JsonResponse({'success': True})


@login_required()
def list_sunchild_view(request):
    context = list_sunchild()
    if 'error' in context:
        messages.error(request, "Erreur, veillez contacté l'administrateur.")
        return redirect('home')
    return render(request, 'html/sunchild/list_sunchild.html', context)


@login_required()
def details_sunchild_view(request, pk):
    context = details_sunchild(pk)
    if 'error' in context:
        messages.error(request, "C'est enfant n'existe pas.")
        return redirect('list_sunchild')
    return render(request, 'html/sunchild/details_sunchild.html', context)


@login_required()
def create_child_view(request):
    day_hospitals = DayHospital.objects.all()
    cases = Case.objects.all()
    regions = Region.objects.all()
    schools = School.objects.all()
    leisures = Leisure.objects.all()
    outpatients = Outpatient.objects.all()

    if request.method == 'POST':
        form = SunChildForm(request.POST)
        if form.is_valid():
            try:
                child = form.save(commit=False)
                child.created_by = request.user.username
                child.updated_by = request.user.username
                child.save()
                form.save_m2m()  # Save ManyToMany relationships
                messages.success(request, 'Enfant crée avec succés!')
                return redirect('list_sunchild_view')
            except Exception as e:
                messages.error(request, f'An error occurred: {e}')
        else:
            # Gestion des erreurs dans le formulaire
            for field in form:
                for error in field.errors:
                    print(f"Error in {field.name}: {error}")
            messages.error(request, 'There was an error in the form. Please check the details.')
    else:
        form = SunChildForm()

    context = {
        'form': form,
        'day_hospitals': day_hospitals,
        'cases': cases,
        'regions': regions,
        'schools': schools,
        'leisures': leisures,
        'outpatients': outpatients,
    }
    return render(request, 'html/sunchild/create_sunchild.html', context)


# Update for SunChild
@login_required()
def update_child_view(request, pk):
    try:
        child = SunChild.objects.get(pk=pk)
    except SunChild.DoesNotExist:
        messages.error(request, 'SunChild not found.')
        return redirect('list_sunchild_view')

    day_hospitals = DayHospital.objects.all()
    cases = Case.objects.all()
    regions = Region.objects.all()
    schools = School.objects.all()
    leisures = Leisure.objects.all()
    outpatients = Outpatient.objects.all()

    if request.method == 'POST':
        form = SunChildForm(request.POST, instance=child)
        if form.is_valid():
            try:
                updated_child = form.save(commit=False)
                updated_child.updated_by = request.user.username
                updated_child.save()
                form.save_m2m()
                messages.success(request, 'SunChild updated successfully!')
                return redirect('list_sunchild_view')
            except Exception as e:
                messages.error(request, f'An error occurred: {e}')
        else:
            for field in form:
                for error in field.errors:
                    print(f"Error in {field.name}: {error}")
            messages.error(request, 'There was an error in the form. Please check the details.')
    else:
        form = SunChildForm(instance=child)

    context = {
        'form': form,
        'day_hospitals': day_hospitals,
        'cases': cases,
        'regions': regions,
        'schools': schools,
        'leisures': leisures,
        'outpatients': outpatients,
    }
    return render(request, 'html/sunchild/update_sunchild.html', context)


# Delete for SunChild
@login_required()
@require_http_methods(["DELETE"])
def delete_child_view(request, pk):
    sunchild = get_object_or_404(SunChild, pk=pk)
    sunchild.delete()
    return JsonResponse({'success': True})


# Create for SurgicalMedicalHistory
@login_required()
def create_surgical_medical_history_view(request):
    form = create_surgical_medical_history(request)
    status = request.session.get('status')  # Get the status of the request
    if status == 'success':  # Check the session value
        messages.success(request, 'SurgicalMedicalHistory créer avec succès')
        del request.session['status']  # Delete the session value -> None
        return redirect('list_surgical_medical_history_view')
    context = {'form': form}
    return render(request, 'html/SurgicalMedicalHistory/create_surgical_medical_history.html', context)


# Update for SurgicalMedicalHistory
@login_required()
def update_surgical_medical_history_view(request, pk):
    form = update_surgical_medical_history(request, pk)
    status = request.session.get('status')
    if status == 'success':
        messages.success(request, 'SurgicalMedicalHistory mis a jour avec success')
        del request.session['status']
        return redirect('list_surgical_medical_history_view')
    context = {'form': form}
    return render(request, 'html/SurgicalMedicalHistory/update_surgical_medical_history.html', context)


# List for SurgicalMedicalHistory
@login_required()
def list_surgical_medical_history_view(request):
    list_surgical_medical_history = surgical_medical_history()
    context = {
        'list_surgical_medical_history': list_surgical_medical_history
    }
    return render(request, 'html/SurgicalMedicalHistory/list_surgical_medical_history.html', context)


@login_required()
def details_surgical_view(request, pk):
    context = details_surgical_medical_history(pk)
    if 'error' in context:
        messages.error(request, "Cette SurgicalMedicalHistory  n'existe pas.")
        return redirect('list_surgical_medical_history_view')
    return render(request, 'html/SurgicalMedicalHistory/details_surgical_medical_history.html', context)


# Delete for SurgicalMedicalHistory
@login_required()
@require_http_methods(["DELETE"])
def delete_surgical_medical_history(request, pk):
    selected_surgical_medical_history = get_object_or_404(SurgicalMedicalHistory, pk=pk)
    selected_surgical_medical_history.delete()
    return JsonResponse({'success': True})


# Create for FamilySurgicalHistory
@login_required()
def create_family_medical_history_view(request):
    form = create_family_medical_history(request)
    status = request.session.get('status')  # Get the status of the request
    if status == 'success':  # Check the session value
        messages.success(request, 'FamilySurgicalHistory créer avec succès')
        del request.session['status']  # Delete the session value -> None
        return redirect('list_family_medical_history_view')
    context = {'form': form}
    return render(request, 'html/familyMedicalHistory/create_family_medical_history.html', context)


# Delete for familyMedicalHistory
@login_required()
@require_http_methods(["DELETE"])
def delete_family_medical_history(request, pk):
    selected_family_medical_history = get_object_or_404(FamilyMedicalHistory, pk=pk)
    selected_family_medical_history.delete()
    return JsonResponse({'success': True})


# List for familyMedicalHistory
@login_required()
def list_family_medical_history_view(request):
    list_family_medical_history = family_medical_history()
    context = {
        'list_family_medical_history': list_family_medical_history
    }
    return render(request, 'html/familyMedicalHistory/list_family_medical_history.html', context)


@login_required()
def details_family_view(request, pk):
    context = details_family_medical_history(pk)
    if 'error' in context:
        messages.error(request, "Cette FamilySurgicalHistory  n'existe pas.")
        return redirect('list_family_medical_history_view')
    return render(request, 'html/familyMedicalHistory/details_family_medical_history.html', context)


# Update for familyMedicalHistory
@login_required()
def update_family_medical_history_view(request, pk):
    form = update_family_medical_history(request, pk)
    status = request.session.get('status')
    if status == 'success':
        messages.success(request, 'familyMedicalHistory mis a jour avec success')
        del request.session['status']
        return redirect('list_family_medical_history_view')
    context = {'form': form}
    return render(request, 'html/familyMedicalHistory/update_family_medical_history.html', context)


# Create for IdentifiedAllergy
@login_required()
def create_identified_allergy_view(request):
    form = create_identified_allergy(request)
    status = request.session.get('status')  # Get the status of the request
    if status == 'success':  # Check the session value
        messages.success(request, 'Allergy identifiée créer avec succès')
        del request.session['status']  # Delete the session value -> None
        return redirect('list_identified_allergy_view')
    context = {'form': form}
    return render(request, 'html/IdentifiedAllergy/create_identified_allergy.html', context)


# list for IdentifiedAllergy
@login_required()
def list_identified_allergy_view(request):
    identified_allergy = list_identified_allergy()
    context = {
        'identified_allergy': identified_allergy
    }
    return render(request, 'html/IdentifiedAllergy/list_identified_allergy.html', context)


@login_required()
def details_identified_allergy_view(request, pk):
    context = details_identified_allergy(pk)
    if 'error' in context:
        messages.error(request, "Cette allergie  n'existe pas.")
        return redirect('list_identified_allergy_view')
    return render(request, 'html/IdentifiedAllergy/details_identified_allergy.html', context)


# Update for IdentifiedAllergy
@login_required()
def update_identified_allergy_view(request, pk):
    form = update_identified_allergy(request, pk)
    status = request.session.get('status')
    if status == 'success':
        messages.success(request, 'Allergie identifiée  mis a jour avec success')
        del request.session['status']
        return redirect('list_identified_allergy_view')
    context = {'form': form}
    return render(request, 'html/IdentifiedAllergy/update_identified_allergy.html', context)


# Delete for IdentifiedAllergy
@login_required()
@require_http_methods(["DELETE"])
def delete_identified_allergy(request, pk):
    identified_allergy = get_object_or_404(IdentifiedAllergy, pk=pk)
    identified_allergy.delete()
    return JsonResponse({'success': True})


# Create for IdentifiedPathology
@login_required()
def create_identified_pathology_view(request):
    form = create_identified_pathology(request)
    status = request.session.get('status')  # Get the status of the request
    if status == 'success':  # Check the session value
        messages.success(request, 'Pathologie identifiée créer avec succès')
        del request.session['status']  # Delete the session value -> None
        return redirect('list_identified_pathology_view')
    context = {'form': form}
    return render(request, 'html/IdentifiedPathology/create_identified_pathology.html', context)


# list for IdentifiedPathology
@login_required()
def list_identified_pathology_view(request):
    identified_pathology = list_identified_pathology()
    context = {
        'identified_pathology': identified_pathology
    }
    return render(request, 'html/IdentifiedPathology/list_identified_pathology.html', context)


@login_required()
def details_identified_pathology_view(request, pk):
    context = details_identified_pathology(pk)
    if 'error' in context:
        messages.error(request, "Cette pathologie n'existe pas.")
        return redirect('list_identified_pathology_view')
    return render(request, 'html/IdentifiedPathology/details_identified_pathology.html', context)


# Update for IdentifiedPathology
@login_required()
def update_identified_pathology_view(request, pk):
    form = update_identified_pathology(request, pk)
    status = request.session.get('status')
    if status == 'success':
        messages.success(request, 'Pathologie identifiée  mis a jour avec success')
        del request.session['status']
        return redirect('list_identified_pathology_view')
    context = {'form': form}
    return render(request, 'html/IdentifiedPathology/update_identified_pathology.html', context)


# Delete for IdentifiedPathology
@login_required()
@require_http_methods(["DELETE"])
def delete_identified_pathology(request, pk):
    identified_pathology = get_object_or_404(IdentifiedPathology, pk=pk)
    identified_pathology.delete()
    return JsonResponse({'success': True})


# Create for BaseMedicalHistory
@login_required()
def create_base_medical_history_view(request):
    form = create_base_medical_history(request)
    status = request.session.get('status')  # Get the status of the request
    if status == 'success':  # Check the session value
        messages.success(request, 'Antécédents médicaux de base créer avec succès')
        del request.session['status']  # Delete the session value -> None
        return redirect('list_base_medical_history_view')
    context = {'form': form}
    return render(request, 'html/BaseMedicalHistory/create_base_medical_history.html', context)


# list for BaseMedicalHistory
@login_required()
def list_base_medical_history_view(request):
    base_medical_history = list_base_medical_history()
    context = {
        'base_medical_history': base_medical_history
    }
    return render(request, 'html/BaseMedicalHistory/list_base_medical_history.html', context)


@login_required()
def details_base_medical_history_view(request, pk):
    context = details_base_medical_history(pk)
    if 'error' in context:
        messages.error(request, "Cette historique medical de base n'existe pas.")
        return redirect('list_base_medical_history_view')
    return render(request, 'html/BaseMedicalHistory/details_base_medical_history.html', context)


@login_required()
def update_base_medical_history_view(request, pk):
    form = update_base_medical_history(request, pk)
    status = request.session.get('status')
    if status == 'success':
        messages.success(request, 'Antécédents médicaux de base  mis a jour avec success')
        del request.session['status']
        return redirect('list_base_medical_history_view')
    context = {'form': form}
    return render(request, 'html/BaseMedicalHistory/update_base_medical_history.html', context)


# Delete for BaseMedicalHistory
@login_required()
@require_http_methods(["DELETE"])
def delete_base_medical_history(request, pk):
    base_medical_history = get_object_or_404(BaseMedicalHistory, pk=pk)
    base_medical_history.delete()
    return JsonResponse({'success': True})


@login_required()
def list_reporting_view(request):
    context = list_reporting()
    return render(request, 'html/reporting/list_reporting.html', context)


# For Events Model (Testing FullCalendar)
def index(request):  
    all_events = Events.objects.all()
    context = {
        "events":all_events,
    }
    return render(request, 'events/index.html', context)


# Get all events from json response
def all_events(request):                                                                                                 
    all_events = Events.objects.all()                                                                                    
    out = []                                                                                                             
    for event in all_events:                                                                                             
        out.append({                                                                                                     
            'title': event.name,                                                                                         
            'id': event.id,                                                                                              
            'start': event.start.strftime("%m/%d/%Y, %H:%M:%S"),                                                         
            'end': event.end.strftime("%m/%d/%Y, %H:%M:%S"),                                                             
        })                                                                                                                                                                                                                           
    return JsonResponse(out, safe=False)


# Add event to the calendar
def add_event(request):
    start = request.GET.get("start", None)
    end = request.GET.get("end", None)
    title = request.GET.get("title", None)
    event = Events(name=str(title), start=start, end=end)
    event.save()
    data = {}
    return JsonResponse(data)


# Update event in the calendar
def update_event(request):
    start = request.GET.get("start", None)
    end = request.GET.get("end", None)
    title = request.GET.get("title", None)
    id = request.GET.get("id", None)
    event = Events.objects.get(id=id)
    event.start = start
    event.end = end
    event.name = title
    event.save()
    data = {}
    return JsonResponse(data)


# Delete event in the calendar
def delete_event(request):
    id = request.GET.get("id", None)
    event = Events.objects.get(id=id)
    event.delete()
    data = {}
    return JsonResponse(data)


# Get All appointments and return it as a JsonResponse
def all_appointments_view(request):
    output = all_appointments()
    return JsonResponse(output, safe=False)


# List appointments
def list_appointments_view(request):
    context = list_appointments()
    return render(request, 'appointment/list_appointment.html', context)


# Create appointment view
def create_appointment_view(request):
    appointment = create_appointment(request)
    appointment.save()
    data = {}
    return JsonResponse(data)


# Update appointment in the calendar
def update_appointment_view(request):
    id = request.GET.get('id', None)
    title = request.GET.get('title', None)
    start = request.GET.get('start', None)
    end = request.GET.get('end', None)
    specialist_id = request.GET.get('specialist', None)
    sun_child_id = request.GET.get('sunChild', None)
    region_id = request.GET.get('region', None)
    site_id = request.GET.get('site', None)
    status_id = request.GET.get('status', None)

    appointment = get_object_or_404(Appointment, id=id)
    specialist = get_object_or_404(User, id=specialist_id)
    sun_child = get_object_or_404(SunChild, id=sun_child_id)
    region = get_object_or_404(Region, id=region_id)
    site = get_object_or_404(Site, id=site_id)
    status = get_object_or_404(AppointmentStatus, id=status_id)

    appointment.name = title
    appointment.start = start
    appointment.end = end
    appointment.specialist = specialist
    appointment.sun_child = sun_child
    appointment.site = site
    appointment.region = region
    appointment.status = status

    appointment.save()
    data = {}
    return JsonResponse(data)


# Delete appointment in the calendar
def delete_appointment_view(request):
    id = request.GET.get("id", None)
    appointment = get_object_or_404(Appointment, id=id)
    appointment.delete()
    data = {}
    return JsonResponse(data)
@login_required()
def create_speciality_view(request):
    form = create_speciality(request)
    status = request.session.get('status')  # Get the status of the request
    if status == 'success':  # Check the session value
        messages.success(request, 'Speciality  créer avec succès')
        del request.session['status']  # Delete the session value -> None
        return redirect('list_speciality_view')
    context = {'form': form}
    return render(request, 'html/Speciality/create_speciality.html', context)


@login_required()
def update_speciality_view(request, pk):
    form = update_speciality(request, pk)
    status = request.session.get('status')
    if status == 'success':
        messages.success(request, 'Speciality mis a jour avec success')
        del request.session['status']
        return redirect('list_speciality_view')
    context = {'form': form}
    return render(request, 'html/Speciality/update_speciality.html', context)


@login_required()
@require_http_methods(["DELETE"])
def delete_speciality(request, pk):
    speciality = get_object_or_404(Speciality, pk=pk)
    speciality.delete()
    return JsonResponse({'success': True})


@login_required()
def list_speciality_view(request):
    speciality = list_speciality()
    context = {
        'speciality': speciality
    }
    return render(request, 'html/Speciality/list_speciality.html', context)


@login_required()
def details_speciality_view(request, pk):
    context = details_speciality(pk)
    if 'error' in context:
        messages.error(request, "Cette spécialité n'existe pas.")
        return redirect('list_speciality_view')
    return render(request, 'html/Speciality/details_speciality.html', context)


@login_required()
def create_specialist_report_view(request):
    form = create_specialist_report(request)
    status = request.session.get('status')  # Get the status of the request
    if status == 'success':  # Check the session value
        messages.success(request, 'Specialist Report  créer avec succès')
        del request.session['status']  # Delete the session value -> None
        return redirect('list_specialist_report_view')
    context = {'form': form}
    return render(request, 'html/SpecialistReport/create_specialist_report.html', context)


@login_required()
def update_specialist_report_view(request, pk):
    form = update_specialist_report(request, pk)
    status = request.session.get('status')
    if status == 'success':
        messages.success(request, 'Specialist Report mis a jour avec success')
        del request.session['status']
        return redirect('list_specialist_report_view')
    context = {'form': form}
    return render(request, 'html/SpecialistReport/update_specialist_report.html', context)


@login_required()
def list_specialist_report_view(request):
    specialist_report = list_specialist_report()
    context = {
        'specialist_report': specialist_report
    }
    return render(request, 'html/SpecialistReport/list_specialist_report.html', context)


@login_required()
def details_specialist_report_view(request, pk):
    context = details_specialist_report(pk)
    if 'error' in context:
        messages.error(request, "Ce rapport de specialiste n'existe pas.")
        return redirect('list_specialist_report_view')
    return render(request, 'html/SpecialistReport/details_speciality.html', context)


@login_required()
@require_http_methods(["DELETE"])
def delete_specialist_report(request, pk):
    specialist_report = get_object_or_404(SpecialistReport, pk=pk)
    specialist_report.delete()
    return JsonResponse({'success': True})


# Pagination
@login_required()
def cases_paginator(request):
    # Get all class objects
    # cases_list = Case.objects.all().order_by('name')
    cases_list = SunChild.objects.all().order_by('first_name')

    # Set up pagination
    paginator = Paginator(cases_list, 8)
    # Get page number
    page = request.GET.get('page')
    cases = paginator.get_page(page)
    page_numbers = range(1, paginator.num_pages + 1)
    last_page_minus_two = paginator.num_pages - 2
    last_page_minus_three = paginator.num_pages - 4
    current_page_plus_three = cases.number + 3

    context = {
        'cases': cases,
        'page_numbers': page_numbers,
        'last_page_minus_two': last_page_minus_two,
        'last_page_minus_three': last_page_minus_three,
        'current_page_plus_three': current_page_plus_three,
    }
    return render(request, 'html/sunchild/cases_paginator.html', context)


# Casess Search
def cases_search(request):
    text = "text"
    context = {
        'text': text,
    }
    return render(request, 'html/sunchild/cases_search.html', context)


# For Zam Project
@login_required()
def list_services_view(request):
    services = Service.objects.all().order_by('name')
    context = {
        'services': services,
    }
    return render(request, 'zam/services/list_services.html', context)


# For Zam Project
# Create Service
@login_required()
def create_service_view(request):
    if request.method == 'POST':
        form = ServiceForm(request.POST)
        if form.is_valid():
            service = form.save(commit=False)
            service.created_by = request.user
            service.save()
            messages.success(request, "Créé avec succès!")
            return redirect('list_services_view')  # Redirect to a view that lists services
    else:
        form = ServiceForm()
    
    context = {'form': form}
    return render(request, 'zam/services/create_service.html', context)


# Update Service
@login_required()
def update_service_view(request, pk):
    service = get_object_or_404(Service, pk=pk)
    if request.method == 'POST':
        form = ServiceForm(request.POST, instance=service)
        if form.is_valid():
            updated_service = form.save(commit=False)
            updated_service.updated_by = request.user
            updated_service.save()
            messages.warning(request, "Mis à jour avec succès!")
            return redirect('list_services_view')  # Redirect to a view that lists services
    else:
        form = ServiceForm(instance=service)
    
    context = {
        'form': form,
        'service': service,
        }
    return render(request, 'zam/services/update_service.html', context)


# Dalete Service
@login_required()
def delete_service_view(request, pk):
    service = get_object_or_404(Service, pk=pk)
    service.delete()
    messages.error(request, "Supprimé avec succès!")
    return redirect('list_services_view')  # Redirect to a view that lists services


# Create a Patient profile
def create_patient_view(request):
    if request.method == 'POST':
        form = PatientForm(request.POST)
        if form.is_valid():
            patient = form.save(commit=False)
            patient.created_by = request.user
            patient.save()
            messages.success(request, "Créé avec succès!")
            return redirect('list_patients_view')  # Redirect to a view that lists services
    else:
        form = PatientForm()
    context = {
        'form': form,
    }
    return render(request, 'zam/patients/create_patient.html', context)


# List Patients to Follow
@login_required()
def list_patients_view(request):
    patients = PatientToFollow.objects.all().order_by('first_name')
    context = {
        'patients': patients,
    }
    return render(request, 'zam/patients/list_patients.html', context)


# Details Patient to Follow
@login_required()
def update_patient_view(request, pk):
    patient = get_object_or_404(PatientToFollow, pk=pk)
    patient_consultation_date = patient.consultation_date

    if request.method == 'POST':
        form = PatientForm(request.POST, instance=patient)
        if form.is_valid():
            get_consultation_date = request.POST.get("consultation_date", None)

            if get_consultation_date:
                # Convert 'consultation_date' to a datetime object
                try:
                    naive_datetime = datetime.strptime(get_consultation_date, '%Y-%m-%dT%H:%M')
                    new_consultation_date = timezone.make_aware(naive_datetime, timezone.get_current_timezone())
                except ValueError:
                    messages.error(request, "Format invalide! Veillez utiliser Année-Mois-Jour Heure:Minute")
                    return render(request, 'zam/patients/update_patient.html', {'form': form, 'patient': patient})
            else:
                new_consultation_date = patient_consultation_date

            updated_patient = form.save(commit=False)
            updated_patient.updated_by = request.user
            updated_patient.consultation_date = new_consultation_date
            updated_patient.save()

            messages.warning(request, "Mis à jour avec succès!")
            return redirect('list_patients_view')
    else:
        form = PatientForm(instance=patient)

    context = {
        'form': form,
        'patient': patient,
    }

    return render(request, 'zam/patients/update_patient.html', context)


# Details Patient to Follow
@login_required()
def delete_patient_view(request, pk):
    patient = get_object_or_404(PatientToFollow, pk=pk)
    context = {
        'patient': patient,
    }
    return render(request, 'zam/patients/update_patient.html', context)


# Create General Report
def create_general_report_view(request):
    if request.method == 'POST':
        form = GeneralReportForm(request.POST)
        if form.is_valid():
            general_report = form.save(commit=False)
            general_report.created_by = request.user
            general_report.save()
            form.save_m2m()  # Save the many-to-many data
            messages.success(request, "Créé avec succès!")
            return redirect('list_general_reports_view')
    else:
        form = GeneralReportForm
    context = {
        'form': form,
    }
    return render(request, 'zam/general_reports/create_general_report.html', context)


# List General Reports
def list_general_reports_view(request):
    general_reports = GeneralReport.objects.all().order_by('date')
    context = {
        'general_reports': general_reports,
    }
    return render(request, 'zam/general_reports/list_general_reports.html', context)


# Update General Report
def update_general_report_view(request, pk):
    general_report = get_object_or_404(GeneralReport, pk=pk)
    general_report_date = general_report.date
    existing_patient_to_follow_ids = general_report.patient_to_follow.values_list('id', flat=True)

    if request.method == 'POST':
        form = GeneralReportForm(request.POST, instance=general_report)
        if form.is_valid():
            # If necessary (if it's a datetime or requires special handling)
            # For simplicity, assuming 'age_range' is a text field in this example.
            get_date = request.POST.get("date", None)

            if get_date:
                # Convert 'date' to a datetime object
                try:
                    naive_datetime = datetime.strptime(get_date, '%Y-%m-%dT%H:%M')
                    new_date = timezone.make_aware(naive_datetime, timezone.get_current_timezone())
                except ValueError:
                    messages.error(request, "Format invalide! Veillez utiliser Année-Mois-Jour Heure:Minute")
                    return render(request, 'zam/general_reports/update_general_report.html', {'form': form, 'general_report': general_report})
            else:
                new_date = general_report_date
            
            updated_general_report = form.save(commit=False)
            updated_general_report.updated_by = request.user
            updated_general_report.date = new_date
            
            # Save the GeneralReport instance
            updated_general_report.save()
            
            # Save many-to-many relationships
            form.save_m2m()
            
            messages.warning(request, "Mis à jour avec succès!")
            return redirect('list_general_reports_view')
    else:
        form = GeneralReportForm(instance=general_report)

    context = {
        'form': form,
        'general_report': general_report,
    }

    return render(request, 'zam/general_reports/update_general_report.html', context)


# Details Patient to Follow
@login_required()
def delete_general_report_view(request, pk):
    general_report = get_object_or_404(GeneralReport, pk=pk)
    general_report.delete()
    messages.error(request, "Supprimé avec succès!")
    return redirect('list_general_reports_view')  # Redirect to a view that lists general reports


login_required()
def list_team_members_view(request):
    team_members = TeamMember.objects.all().order_by('first_name')
    context = {
        'team_members': team_members,
    }
    return render(request, 'zam/team_members/list_team_members.html', context)


# Create Team Member
@login_required
def create_team_member_view(request):
    if request.method == 'POST':
        form = TeamMemberForm(request.POST)
        if form.is_valid():
            team_member = form.save(commit=False)
            team_member.created_by = request.user  # Set the user who created the form
            team_member.save()  # Save the instance to the database
            form.save_m2m()  # Save many-to-many relationships
            messages.success(request, "Créé avec succès!")
            return redirect('list_team_members_view')  # Redirect to the list view or another appropriate view
    else:
        form = TeamMemberForm()  # Create an empty form for GET requests
    context = {
        'form': form
    }
    return render(request, 'zam/team_members/create_team_member.html', context)


@login_required()
def update_team_member_view(request, pk):
    team_member = get_object_or_404(TeamMember, pk=pk)
    team_member_consultation_date = team_member.consultation_date

    if request.method == 'POST':
        form = TeamMemberForm(request.POST, instance=team_member)
        if form.is_valid():
            get_consultation_date = request.POST.get("consultation_date", None)

            if get_consultation_date:
                # Convert 'consultation_date' to a datetime object
                try:
                    naive_datetime = datetime.strptime(get_consultation_date, '%Y-%m-%dT%H:%M')
                    new_consultation_date = timezone.make_aware(naive_datetime, timezone.get_current_timezone())
                except ValueError:
                    messages.error(request, "Format invalide! Veillez utiliser Année-Mois-Jour Heure:Minute")
                    return render(request, 'zam/team_members/update_team_member.html', {'form': form, 'team_member': team_member})
            else:
                new_consultation_date = team_member_consultation_date


            updated_team_member = form.save(commit=False)
            updated_team_member.updated_by = request.user  # Set the user who updated the form
            updated_team_member.consultation_date = new_consultation_date  # Set the consultation date value based on the verification above
            updated_team_member.save()  # Save the instance to the database
            form.save_m2m()  # Save many-to-many relationships
            messages.warning(request, "Mis à jour avec succès!")
            return redirect('list_team_members_view')  # Redirect to the list view or another appropriate view
    else:
        form = TeamMemberForm(instance=team_member)  # Create a form instance pre-filled with existing data

    context = {'form': form, 'team_member': team_member}
    return render(request, 'zam/team_members/update_team_member.html', context)


@login_required()
def delete_team_member_view(request, pk):
    team_member = get_object_or_404(TeamMember, pk=pk)
    team_member.delete()
    messages.error(request, "Supprimé avec succès!")
    return redirect('list_team_members_view') 
