from multiprocessing.util import ForkAwareThreadLock
# from tkinter.tix import Tree
from django.conf import settings
from django.shortcuts import render, redirect
from django.http import HttpResponseRedirect
# from django.contrib.auth.models import User
from django.contrib import messages
from django.contrib.auth import authenticate, login, logout

from django.contrib.auth.decorators import login_required
from django.contrib.auth.forms import UserCreationForm

from reseau.models import CustomUser, Metier, Mission, ProfilRecherche, Service, Structure, Worker
from .forms import MissionForm, CreateUserForm, CreateWorkerForm, SimpleForm

#  Send email
from django.core.mail import send_mail

# Get current year and month
from datetime import datetime, date
from django.utils import timezone

# Requêtes complexes avec des objets Q
from django.db.models import Q

# Sérialisation d’objets Django
from django.core import serializers

# import locale
# locale.setlocale(locale.LC_TIME,'')

# from reseau.models import CustomUser


# Create your views here.


def main(request):
    context = {}
    return render(request, 'reseau/main.html', context)


def home(request):
    print(request.method)

    # if request.user.is_superuser:  # request.user.is_authenticated:
    #     return redirect('admin')
    # user = authenticate(request, username=username, password=password)
    # if request.user is not None:
    #     if request.user.is_worker:
    #         login(request, user)
    #         return redirect('admin')
    #     elif request.user.is_manager:
    #         # elif request.user.is_admin:
    #     else:
    #         login(request, user)
    #         messages.error(request, "You are not an ADMIN !!!")
    #         return redirect('home')

    # else:
    #     messages.error(request, "User OR password does not exist")

    if request.method == 'POST':
        print(request.POST.get('missionRefSearched'))
        print('STRUCTURE ID = ' + str(request.user.worker.structure.id))
        # structures = Structure.objects.get(
        #     code=request.POST.get('missionRefSearched'))
        structures = Structure.objects.all()
        # missions = Mission.objects.filter(
        #     referenceNumber=request.POST.get('missionRefSearched'))

        # myStruct = Mission.objects.filter(
        #     Q(structure__structures_allowed_worker__user_id=request.user.id))
        # myStruct = Mission.objects.filter(
        #     Q(structure_id=request.user.worker.structure.id))

        missions = Mission.objects.filter(Q(structure__structures_allowed_worker__user_id=request.user.id) | Q(
            structure_id=request.user.worker.structure.id)).filter(Q(referenceNumber__icontains=request.POST.get('missionRefSearched')))
        # missions = myStruct
        print(type(missions))
    else:
        structures = Structure.objects.all()

        print(request.user)
        if request.user.is_anonymous:
            missions = Mission.objects.all()
        elif request.user.is_worker:
            print('WORKER !!!')
            missionStructure = Structure.objects.get(code='HOP S008')
            print(missionStructure)  # Hôpital de Pikine
            # get first of queryset
            print(missionStructure.structures_allowed_worker.first())
            # see if contains worker
            print(missionStructure.structures_allowed_worker.filter(
                user__username='worker'))

            print('USER IS : '+request.user.username)
            print('request.user.worker TYPE IS : ' +
                  str(type(request.user.worker)))
            print('WORKER IS : '+str(request.user.worker))

            # missions = Mission.objects.filter(
            #     structure__structures_allowed_worker__user_id=request.user.id )
            missions = Mission.objects.filter(Q(structure__structures_allowed_worker__user_id=request.user.id) | Q(
                structure_id=request.user.worker.structure.id))
        elif request.user.is_manager:
            print('MANAGER !!!')
            missions = Mission.objects.all()
        else:
            missions = Mission.objects.all()
        print(type(missions))

    context = {'structures': structures, 'missions': missions}
    return render(request, 'reseau/home.html', context)


@login_required(login_url='logingestionnaire')
def listMissions(request):
    print(request.method)

    structures = Structure.objects.all()
    missions = Mission.objects.all()
    services = Service.objects.all()
    metiers = Metier.objects.all()
    workers = Worker.objects.all()
    managers = CustomUser.objects.filter(is_manager=True)

    if request.method == 'POST':
        
        # WORKER
        if request.user.is_worker: 
            print(request.POST.get('missionRefSearched'))
            print('STRUCTURE ID = ' + str(request.user.worker.structure.id))
            # structures = Structure.objects.get(
            #     code=request.POST.get('missionRefSearched'))
            
            # missions = Mission.objects.filter(
            #     referenceNumber=request.POST.get('missionRefSearched'))

            # myStruct = Mission.objects.filter(
            #     Q(structure__structures_allowed_worker__user_id=request.user.id))
            # myStruct = Mission.objects.filter(
            #     Q(structure_id=request.user.worker.structure.id))

            missions = Mission.objects.filter(Q(structure__structures_allowed_worker__user_id=request.user.id) | Q(
                structure_id=request.user.worker.structure.id)).filter(Q(referenceNumber__icontains=request.POST.get('missionRefSearched')))
            # missions = myStruct
            print(type(missions))

        # MANAGER 
        elif request.user.is_manager:
            print('MANAGER RESQUEST OK ...........')
            print(request.POST.get('missionRefSearched'))

            missions = Mission.objects.filter(referenceNumber__icontains=request.POST.get('missionRefSearched'))
    else:
        print(request.user)
        if request.user.is_anonymous:
            print('ANONYMOUS RESQUEST OK ...........')
        elif request.user.is_worker:
            print('WORKER REQUEST OK ........ !!!')
            missionStructure = Structure.objects.get(code='HOP S008')
            print(missionStructure)  # Hôpital de Pikine
            # get first of queryset
            print(missionStructure.structures_allowed_worker.first())
            # see if contains worker
            print(missionStructure.structures_allowed_worker.filter(
                user__username='worker'))

            print('USER IS : '+request.user.username)
            print('request.user.worker TYPE IS : ' +
                  str(type(request.user.worker)))
            print('WORKER IS : '+str(request.user.worker))

            # missions = Mission.objects.filter(
            #     structure__structures_allowed_worker__user_id=request.user.id )
            missions = Mission.objects.filter(Q(structure__structures_allowed_worker__user_id=request.user.id) | Q(
                structure_id=request.user.worker.structure.id))
        elif request.user.is_manager:
            print('MANAGER !!!')
            missions = Mission.objects.all()
        else:
            missions = Mission.objects.all()
        print(type(missions))



    context = {'structures': structures, 'missions': missions, 'services': services, 'metiers': metiers, 'workers': workers, 'managers': managers}
    return render(request, 'reseau/missions_list.html', context)

@login_required(login_url='logingestionnaire')
def missionsFilter(request):
    print('Filter clicked !! REQUEST METHODE = ' + request.method + ' OK !!!')

    # Initialisation
    services = Service.objects.all()
    structures = Structure.objects.all()
    missions = Mission.objects.all()
    missions_q0 = Mission.objects.all()
    print('___Mission ALL___ :')
    print(missions_q0)
    metiers = Metier.objects.all()

    workers = Worker.objects.all()
    managers = CustomUser.objects.filter(is_manager=True)

    # for myMission in missions_q0:
    #     print(myMission.start.hour) 

    # Method POST donc bouton filtre clique
    if request.method == 'POST':
        # print('Oui cest bien un POST !!!!!!!!')

        # Get all selected values
        # available 
        queryFilterDateStart = request.POST.get('missionFilterDateStart')
        queryFilterDateFinish = request.POST.get('missionFilterDateFinish')
        queryFilterAvailable = request.POST.get('missionFilterAvailable')
        queryFilterCancelled = request.POST.get('missionFilterCancelled')
        queryFilterManager = request.POST.get('missionFilterManager')
        queryFilterWorker = request.POST.get('missionFilterWorker')
         
        
        queryFilterStructure = request.POST.get('missionFilterStructure')
        queryFilterService = request.POST.get('missionFilterService')
        queryFilterMetier = request.POST.getlist('missionFilterMetier')
        print('____ METIERS :') 
        print(queryFilterMetier) 
        queryFilterDayAndOrNight = request.POST.get('missionFilterDayAndOrNight')
 
        print('____ Mission Filter Date Start :' + queryFilterDateStart) # str(type(queryFilterDateStart))

        # Date
        if queryFilterDateStart != '':
            print('____ Date Start not VOID :' + queryFilterDateStart) 
            missions_q0 = missions_q0.filter(startDate__gte=queryFilterDateStart)
        if queryFilterDateFinish != '':
            print('____ Date Start not VOID :' + queryFilterDateStart)
            missions_q0 = missions_q0.filter(finishDate__lte=queryFilterDateFinish)

        if queryFilterAvailable == 'Non pourvues':
            print('____Non pourvues')
            # missions_q0 = missions_q0.filter(available=True)
            missions_q0 = missions_q0.filter(worker__isnull=True)
        elif queryFilterAvailable == 'Pourvue et validée':
            missions_q0 = missions_q0.filter(available=False)
        elif queryFilterAvailable == 'Pourvue et non validée':
            missions_q0 = missions_q0.filter(available=True).filter(candidates__isnull=True)

        if queryFilterCancelled == 'Annulée':
            missions_q0 = missions_q0.filter(isCancelled=True)
        elif queryFilterCancelled == 'Non annulée':
            missions_q0 = missions_q0.filter(isCancelled=False)

        if queryFilterManager != 'Administrateur':
            missions_q0 = missions_q0.filter(administrator__username=queryFilterManager)

        if queryFilterWorker != 'Remplaçants':
            missions_q0 = missions_q0.filter(candidates__user__username=queryFilterWorker)
            print('___Mission after Remplacants___ :')
            print(missions_q0)

        if queryFilterStructure != 'Etablissement':
            missions_q0 = missions_q0.filter(structure__name=queryFilterStructure)

        if queryFilterService != 'Service':
            missions_q0 = missions_q0.filter(service__name=queryFilterService)     

        # if queryFilterMetier != 'Métier':
        # On filtre si
        if not 'Métier' in queryFilterMetier and len(queryFilterMetier)>0 or len(queryFilterMetier)>1:
            # print('___ Missions before Metier ___ :')
            # print(missions_q0)
            # missions_q0 = missions_q0.filter(profil__name=queryFilterMetier)  
            missions_q0 = missions_q0.filter(profil__name__in=queryFilterMetier)  
            # print('___ Missions after Metier ___ :')
            # print(missions_q0)
            # print('___ queryFilterMetier ___ :')
            # print(queryFilterMetier)

        print('___ queryFilterDayAndOrNight ___ :')
        print(queryFilterMetier)
        if queryFilterDayAndOrNight == 'Jour':
            # missions_q0 = missions_q0.filter(finish__hour__lte=9) 
            missions_q0 = missions_q0.filter(finishTime__hour__lte=9) 
        elif queryFilterDayAndOrNight == 'Nuit':
            # missions_q0 = missions_q0.filter(finish__hour__gt=9)       
            missions_q0 = missions_q0.filter(finishTime__hour__gt=9)       

        

        print('queryFilterStructure = ' + queryFilterStructure + ' !!!')    
        print('queryFilterService = ' + queryFilterService + ' !!!')    
        #  requete finale
        # missions = Mission.objects.filter(structure__name='Hôpital Aristide Le Dantec CHU').filter(service__name=queryFilterService)
        missions = missions_q0

        # filterStart = date(2021, 12, 19)
        # filterFinish = date(2022, 12, 24)
        # print('MANAGER !!! After Filter' + str(filterFinish))

        # Filtre 4 : Afficher missions pourvues ou non pourvues, ET de telle structure, ET vacation, ET service
        # missions = Mission.objects.filter(available=True).filter(
            # structure__name='Hôpital Aristide Le Dantec CHU').filter(            
            #     type__name='Vacation').filter(service__name='Gastro-entérologie').filter(profil__name = 'Les sages femmes').filter(
            #         start__gte = filterStart).filter(finish__lte = filterFinish).filter(administrator__username='manager')

        # print('answer : '+answer + ' !!!!!!!!!!!!!!')
    elif request.method == 'GET':
        print('Oui cest bien un GET !!!!!!!!')




    print('___ Filter END !!!')
    print(missions)
    context = {'structures': structures, 'missions': missions, 'services': services, 'metiers': metiers, 'workers': workers, 'managers': managers}
    return render(request, 'reseau/missions_list.html', context)

@login_required(login_url='logingestionnaire')
def missionsFilter2(request):
    print('Filter clicked !!')
    print(request.method)


    if request.method == 'POST':
        answer = request.POST.get('missionFilterService')
        print('answer : '+answer + ' !!!!!!!!!!!!!!')
        # print(request.POST.get('missionRefSearched'))
        # print('STRUCTURE ID = ' + str(request.user.worker.structure.id))
        # structures = Structure.objects.get(
        #     code=request.POST.get('missionRefSearched'))
        structures = Structure.objects.all()
        # missions = Mission.objects.filter(
        #     referenceNumber=request.POST.get('missionRefSearched'))

        # myStruct = Mission.objects.filter(
        #     Q(structure__structures_allowed_worker__user_id=request.user.id))
        # myStruct = Mission.objects.filter(
        #     Q(structure_id=request.user.worker.structure.id))

        missions = Mission.objects.filter(Q(structure__structures_allowed_worker__user_id=request.user.id) | Q(
            structure_id=request.user.worker.structure.id)).filter(Q(referenceNumber__icontains=request.POST.get('missionRefSearched')))
        # missions = myStruct
        print(type(missions))
    else:
        structures = Structure.objects.all()

        print(request.user)
        if request.user.is_anonymous:
            missions = Mission.objects.all()
        elif request.user.is_worker:
            print('WORKER !!!')
            missionStructure = Structure.objects.get(code='HOP S008')
            print(missionStructure)  # Hôpital de Pikine
            # get first of queryset
            print(missionStructure.structures_allowed_worker.first())
            # see if contains worker
            print(missionStructure.structures_allowed_worker.filter(
                user__username='worker'))

            print('USER IS : '+request.user.username)
            print('request.user.worker TYPE IS : ' +
                  str(type(request.user.worker)))
            print('WORKER IS : '+str(request.user.worker))

            # missions = Mission.objects.filter(
            #     structure__structures_allowed_worker__user_id=request.user.id )
            missions = Mission.objects.filter(Q(structure__structures_allowed_worker__user_id=request.user.id) | Q(
                structure_id=request.user.worker.structure.id))
        elif request.user.is_manager:
            
            # missions = Mission.objects.all()
            # missions = Mission.objects.filter(Q(structure__structures_allowed_worker__user_id=request.user.id) | Q(
            #     structure_id=request.user.worker.structure.id))

            # Filtre 1 : Afficher missions pourvues ou non pourvues
            # missions = Mission.objects.filter(available=True)

            # Filtre 2 : Afficher missions pourvues ou non pourvues, ET de telle structure
            # missions = Mission.objects.filter(available=True).filter(
            #     structure__name='Hôpital Aristide Le Dantec CHU')
                ## structure__name='Centre hospitalier Abdoul Aziz Sy parcelles assainies')

            # Filtre 3 : Afficher missions pourvues ou non pourvues, ET de telle structure, ET vacation
            # missions = Mission.objects.filter(available=True).filter(
            #     structure__name='Hôpital Aristide Le Dantec CHU').filter(
            #         type__name='Vacation')

            filterStart = date(2021, 12, 19)
            filterFinish = date(2022, 12, 24)
            print('MANAGER !!! After Filter' + str(filterFinish))
            

            # Filtre 4 : Afficher missions pourvues ou non pourvues, ET de telle structure, ET vacation, ET service
            missions = Mission.objects.filter(available=True).filter(
                structure__name='Hôpital Aristide Le Dantec CHU').filter(            
                    type__name='Vacation').filter(service__name='Gastro-entérologie').filter(profil__name = 'Les sages femmes').filter(
                        start__gte = filterStart).filter(finish__lte = filterFinish).filter(administrator__username='manager')
                        # structure__name='Centre hospitalier Abdoul Aziz Sy parcelles assainies').filter(
                            # Gastro-entérologie
                            # Pneumologie

            # filterDay = False
            # filterNight = False
            # if (filterDay and not filterNight):
            #     print('Filter Day : ' + str(filterDay))
            #     missions = missions.filter(finish__hour__lte = 22).filter(start__hour__gte = 4)
            # elif (not filterDay and filterNight):
            #     print('Filter Night : ' + str(filterNight))
            #     missions = missions.filter(finish__hour__lte = 9).filter(start__hour__gte = 18)
            

            
                
        else:
            missions = Mission.objects.all()
        print(type(missions))

    services = Service.objects.all();
    print('Filter END !!')
    context = {'structures': structures, 'missions': missions, 'services': services}
    return render(request, 'reseau/missions_list.html', context)



@login_required(login_url='loginadmin')
def admin(request):
    structures = Structure.objects.all()
    context = {'structures': structures}
    return render(request, 'reseau/admin.html', context)


@login_required(login_url='logingestionnaire')
def gestionnaire(request):
    structures = Structure.objects.all()
    context = {'structures': structures}
    return render(request, 'reseau/gestionnaire.html', context)


@login_required(login_url='loginremplacant')
def remplacant(request):
    # structures = Structure.objects.all()
    # workers = CustomUser.objects.filter(is_worker=True)

    print(request.method)

    if request.method == 'POST':
        print(request.POST.get('workerReshearched'))
        # workers = Worker.objects.all()
        workers = Worker.objects.filter(
            Q(user__first_name__icontains=request.POST.get('workerReshearched')) |
            Q(user__last_name__icontains=request.POST.get('workerReshearched')))
        print(type(workers))
    else:
        workers = Worker.objects.all()
        print(type(workers))

    context = {'workers': workers}
    return render(request, 'reseau/remplacant.html', context)


def loginadmin(request):
    if request.user.is_superuser:  # request.user.is_authenticated:
        return redirect('admin')

    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')

        user = authenticate(request, username=username, password=password)
        if user is not None:
            # if user.is_superuser:
            if user.is_admin:
                login(request, user)
                return redirect('admin')
            else:
                messages.error(request, "Vous n'êtes pas  ADMIN !!!")
                return redirect('home')

        else:
            messages.error(request, "Login ou mot de passe incorrect !")

    # try:
    #     # user = User.objects.get(username=username)

    # except:
    #     # messages.error(request, 'User does not exist')

    context = {}
    return render(request, 'reseau/loginadmin.html', context)


def loginremplacant(request):
    if request.user.is_authenticated:
        return redirect('remplacant')

    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')

        print("TEST !!!!!!!!")
        user = authenticate(request, username=username, password=password)

        if user is None:
            messages.error(request, "Login ou mot de passe incorrect !")
            # return redirect("worker-admissions")
            return redirect("loginremplacant")

        print(user.id)
        myWorker = Worker.objects.get(user_id=user.id)
        print(myWorker.matricule)
        print(myWorker.cv)
        print(myWorker.cv.url)

        # Test : worker.cv is not None
        # myWorker = Worker(user=user)
        # myWorker = Worker.objects.get(user_id=user.id)
        # print(myWorker.matricule)
        # candidate = Worker.objects.get(user_id=workerPK)

        if user is not None and user.is_worker:
            print("OK USER IS NOT NONE AND IS WORKER !!!!!!!!")  
            
            login(request, user)            
            return redirect('remplacant')
        else:
            messages.error(request, "Login ou mot de passe incorrect !")
            # return redirect("worker-admissions")
            return redirect("home")

    context = {}
    return render(request, 'reseau/loginremplacant.html', context)


def logingestionnaire(request):
    if request.user.is_authenticated:
        return redirect('gestionnaire')

    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')

        user = authenticate(request, username=username, password=password)
        if user is not None and user.is_manager:
            login(request, user)
            if(request.GET.get('next')):
                # Redirect if there is a NEXT variable in the REQUEST
                return redirect(request.GET.get('next'))
            else:
                return redirect('gestionnaire')
        else:
            messages.error(request, "Login ou mot de passe incorrect !")

    context = {}


    # return redirect(self.request.GET.get('next'))
    return render(request, 'reseau/logingestionnaire.html', context)


@ login_required(login_url='home')
def logoutUser(request):
    logout(request)
    return redirect('home')


def registerUser(request):

    structRegistered = Structure.objects.filter(code=request.POST.get('code_structure'))

    print(structRegistered)

    # form = UserCreationForm()
    form = CreateUserForm()

    if request.method == 'POST':
        # Recuperer le code de la structure
        myCodeStructure = (request.POST.get('code_structure'))
        # print("*****" + myCodeStructure)
        # codeStructureIsValid =   true or false

        # form = UserCreationForm(request.POST)
        form = CreateUserForm(request.POST)
        if form.is_valid() and structRegistered:
            user = form.save(commit=False)
            user.username = user.username.lower()
            user.is_worker = True
            # 1st method to transfer value of user
            # userjson = serializers.serialize("json", user)
            # request.session['userjson'] = userjson
            # request.session['user'] = user
            # request.session['structRegistered'] = structRegistered 
            # 
            # 
            request.session['username'] = user.username               
            request.session['first_name'] = user.first_name               
            request.session['last_name'] = user.last_name               
            request.session['email'] = user.email               
            request.session['password'] = request.POST.get('password')               
            request.session['user_pwd'] = user.password               
            request.session['myCodeStructure'] = myCodeStructure            

            return redirect('registerworker')

            # context = {'user': user, 'structRegistered': structRegistered}
            # render(request, 'reseau/registerworker.html', context)


            # user.save()
            # newWorker = Worker(user=user)
            # newWorker.structure = structRegistered.first() 
            # newWorker.save()            
            # login(request, user)
            # return redirect('home')
        else:
            messages.error(request, "Une erreur est apparue lors de l'inscription")

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

def registerWorker(request):

    # structRegistered = Structure.objects.filter(code=request.POST.get('code_structure'))

    # user = request.session['user']
    # structRegistered =  request.session['structRegistered']

    myCodeStructure = request.session['myCodeStructure']
    print("***** " + myCodeStructure + " *****")
    structRegistered = Structure.objects.filter(code=request.POST.get('code_structure'))

    # 
    # userjson = request.session['userjson'] 
    # user = serializers.deserialize("json", userjson)
    # print(" ***** " + user + " ***** ")

    username = request.session['username']
    print(" ***** " + username + " ***** ")

    user = CustomUser()
    # user.username = request.session['username']
    user.first_name = request.session['first_name']
    user.last_name = request.session['last_name']
    username = user.first_name + user.last_name
    user.username = username.replace(" ", "")
    user.email = request.session['email']
    user.password = request.session['user_pwd']             
    user.is_worker = True

    form = CreateWorkerForm(initial={'user': user})

    print("***** " + user.password + " *****")

    if request.method == 'POST':
        form = CreateWorkerForm(request.POST)

        if form.is_valid():            
            user.save()

            newWorker = form.save(commit=False)
            newWorker.user = user

            # newWorker = Worker(user=user)            
            # newWorker.structure = structRegistered.first() 
            newWorker.save() 
            login(request, user)
            return redirect('home')
        else:
            messages.error(request, "Une erreur est apparue lors de l'inscription")

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


def createMission(request):
    print(" *******  CREER MISSION 11 by ********* " + str(request.user))
    # form = MissionForm(initial={'administrator': str(request.user)})
    # form = MissionForm(initial={'administrator': 'Toto'})


    # Test form
    testForm = SimpleForm()



    # Modification des champs du formulaire avant validation
    form = MissionForm()
    form.fields['administrator'].initial = request.user

    # form.fields['isExpress'].initial = True
    # form = MissionForm(instance=request.user)
    print('********' +  str(form.fields['isExpress']))
    # print('********' +  str(form.cleaned_data['isExpress'])) # 'MissionForm' object has no attribute 'cleaned_data'

    # Process data
    if request.method == 'POST':
        print("*******  CREER/REQUEST POST.get 2 ********* : " + str(request.POST.get('isExpress')))
        print(request.POST.get('service'))

        queryStartHour = request.POST.get('startHour') 
        queryEndHour = request.POST.get('endHour')
        queryProfil = request.POST.get('myProfil')

        print("*******  CREER/REQUEST POST.startHour ********* : " + str(queryStartHour))
        print("*******  CREER/REQUEST POST.endHour ********* : " + str(queryEndHour))
        print(form.fields['startTime'])

        # form = MissionForm(request.POST)
        # form.fields['startTime'].initial = queryStartHour
        # form.fields['finishTime'].initial = queryEndHour

        myPost = request.POST.copy()
        myPost['startTime'] = queryStartHour
        myPost['finishTime'] = queryEndHour
        form = MissionForm(myPost)
        # form = MissionForm(myPost)

        # myPost = request.POST.copy()
        # myPost['startTime'] = queryStartHour #'00:00'
        # myPost['finishTime'] = queryEndHour # '01:00'
        # myPost['isExpress'] = 'True'
        # myPost['profil'] = queryProfil

        # TODO_CDD
        # toto = ProfilRecherche.objects.filter(Q(name__icontains=request.POST.get('myProfil')))
        # myPost['profil'] = ProfilRecherche.objects.filter(Q(name__icontains=request.POST.get('myProfil')))
        # form = MissionForm(myPost)
    
        # form = MissionForm([{'csrfmiddlewaretoken': ['vi7ef5w78iA7SRPRZI69J2NFrdcgLkm75FoVNYvSiJkox9dAnfSEXmdc2Gdl9Ggg'], 'type': ['2'], 'structure': ['13'], 'service': ['15'], 'start': ['2022-10-25 05:15:00'], 'finish': ['2022-10-25 10:15:00'], 'profil': ['7'], 'motif': ['7'], 'worker': ['7'], 'candidates': ['7'], 'administrator': ['3']}])


        print("*******  CREER/REQUEST FORM 3 ********* : " + str(form.is_valid()))
        if form.is_valid():
            myMission = form.save(commit=False)

            # Recuperer le nombre de mission de la structure, cette annee et ce moi-ci
            # print(myTime.year)
            structMissions = Mission.objects.filter(
                structure_id=myMission.structure.id).filter(startDate__year=myMission.startDate.year)  # .filter(start__month=myMission.start.month)  # structure
            # print(structMissions)
            structMissionsCount = structMissions.count()
            # print(getNbStructFormat(structMissionsCount))

            # Previous 1
            # myMission.referenceNumber = myMission.structure.code + "-" + \
            #     str(myTime.year) + "-" + getMonthFormat(myTime.month)

            # Previous 2
            # myMission.referenceNumber = myMission.structure.code + \
            #     str(myMission.startDate.year) + "-" + getMonthFormat(myMission.startDate.month) + \
            #     "-" + getNbStructFormat(structMissionsCount+1)

            # Current
            myMission.referenceNumber = myMission.structure.code + \
                str(myMission.startDate.year)[-2:] + \
                getNbStructFormat(structMissionsCount+1)
            myMission.referenceNumber = myMission.referenceNumber.replace(" ", "")
            print(myMission.referenceNumber)


            myMission.administrator = request.user
            print(myMission.isExpress)
            myMission.save()
            # myTime = datetime.now()
            # print(myTime.year)
            # form.save()
            # return redirect('home')
            return redirect('list-missions')
        
        else:
            print(form.errors.as_data()) # here you print errors to terminal


    context = {'form': form, 'testForm': testForm}
    return render(request, 'reseau/mission_form.html', context)


def declareMission(request):
    print("*******  DECLARER 1 *********")
    getEndHour = request.GET.get('endHour') # OK
    
    print('***** ' + str(request.POST.get('csrfmiddlewaretoken')) + ' *****' + str(getEndHour))
    

    form = MissionForm()
    # print("*******  DECLARER / GET 2 ********* " + str(form.startDate))
    # form = MissionDeclareForm()

    # print("*******  DECLARER / START TIME  ********* " + request.POST.get('endHour'))


    # Process data
    if request.method == 'POST':
        print(request.POST)

        queryStartHour = request.POST.get('startHour')
        queryEndHour = request.POST.get('endHour')

        print('***** POST 1 *****' + str(queryEndHour)  + ' *****' + str(request.POST.get('startHour')))
        # Test que si un form est renseigné manuellement ça marche
        # form = MissionForm(initial={'type': 'Vacation', 'structure': 'Centre hospitalier Roi Baudouin', 'service': 'Pneumologie', 'start': '2022-10-25 06:15:00', 'finish': '2022-10-25 10:15:00', 'profil': 'Brancardier', 'motif': 'Congés bonifiés', 'worker': 'worker2', 'candidates': 'worker2', 'administrator': 'manager2'})

        # Modification des donnees du post avant creation du formulaire
        myPost = request.POST.copy()
        myPost['startTime'] = queryStartHour #'00:00'
        myPost['finishTime'] = queryEndHour # '01:00'
        myPost['isExpress'] = 'True'
        form = MissionForm(myPost)
        # print(form.fields["service"])
        # form.fields["startTime"].initial = request.POST.get('startHour')
        # form = MissionForm(request.POST, initial={"type": "Vacation", "finish": "2022-10-25 10:15:00"})
        # form.fields['finish'].initial = '2022-10-25 10:15:00'
        # form = MissionForm([{'csrfmiddlewaretoken': [request.POST.get('csrfmiddlewaretoken')], 'type': ['2'], 'structure': ['13'], 'service': ['15'], 'start': ['2022-10-25 06:15:00'], 'finish': ['2022-10-25 10:15:00'], 'profil': ['7'], 'motif': ['7'], 'worker': ['7'], 'candidates': ['7'], 'administrator': ['3']}])
        # form = MissionDeclareForm()

        print("*******  DECLARER / POST 2 ********* " + str(form.is_valid()))
        # print("*******  DECLARER / POST 2 / StartTime ********* " + str(myMission.startTime))
        
        
        # print(form['finishDate'].value())
        # print(form['finishTime'].value())
        # print("*******  DECLARER / START TIME  ********* " + request.POST.get('endHour'))

        # tempMission = form.save(commit=False)
        # print(tempMission)
        if form.is_valid():
            print("*******  DECLARER / is_valid 3 *********")
            myMission = form.save(commit=False)

            # Recuperer le nombre de mission de la structure, cette annee et ce moi-ci
            # print(myTime.year)
            structMissions = Mission.objects.filter(
                structure_id=myMission.structure.id).filter(startDate__year=myMission.startDate.year)  # .filter(start__month=myMission.start.month)  # structure
            # print(structMissions)
            structMissionsCount = structMissions.count()
            # print(getNbStructFormat(structMissionsCount))

            # Previous 1
            # myMission.referenceNumber = myMission.structure.code + "-" + \
            #     str(myTime.year) + "-" + getMonthFormat(myTime.month)

            # Previous 2
            # myMission.referenceNumber = myMission.structure.code + "-" + \
            #     str(myMission.startDate.year) + "-" + getMonthFormat(myMission.startDate.month) + \
            #     "-" + getNbStructFormat(structMissionsCount+1)
            
            # Current 
            myMission.referenceNumber = myMission.structure.code + \
                str(myMission.startDate.year)[-2:] + \
                getNbStructFormat(structMissionsCount+1)
            myMission.referenceNumber = myMission.referenceNumber.replace(" ", "")
            print(myMission.referenceNumber)

            # Createur de la mission = le manager qui a cree la mission
            myMission.administrator = request.user
            print("*** " + str(myMission.administrator))

            # La date et l'heure de la déclaration
            myMission.assigned = datetime.now()

            myMission.save()
            # myTime = datetime.now()
            # print(myTime.year)
            # form.save()
            return redirect('home')
        else:
            print(form.errors.as_data()) # here you print errors to terminal

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


def updateMission(request, pk):
    mission = Mission.objects.get(id=pk)
    form = MissionForm(instance=mission)
    # Process data
    if request.method == 'POST':
        form = MissionForm(request.POST, instance=mission)
        if form.is_valid():
            myTime = datetime.now()
            myMission = form.save(commit=False)
            # print(myTime.year)
            structMissions = Mission.objects.filter(
                structure_id=myMission.structure.id).filter(start__year=myMission.start.year)  # .filter(start__month=myMission.start.month)  # structure
            # print(structMissions)
            structMissionsCount = structMissions.count()
            # print(getNbStructFormat(structMissionsCount))
            myMission.referenceNumber = mission.structure.code + "-" + \
                str(myTime.year) + "-" + getMonthFormat(myTime.month) + \
                "-" + getNbStructFormat(structMissionsCount)

            # Createur de la mission = le manager qui a cree la mission
            myMission.administrator = request.user
            print("*** " + str(myMission.administrator))

            myMission.save()
            return redirect('home')
    context = {'form': form}
    return render(request, 'reseau/mission_form.html', context)


def getMonthFormat(value):
    if value < 10:
        valueFormat = "0"+str(value)
    elif value < 13:
        valueFormat = str(value)
    return valueFormat


def getNbStructFormat(MissionsNb):
    if MissionsNb < 10:
        MissionsNbFormat = "00"+str(MissionsNb)
    elif MissionsNb < 100:
        MissionsNbFormat = "0"+str(MissionsNb)
    elif MissionsNb < 1000:
        MissionsNbFormat = str(MissionsNb)
    return MissionsNbFormat


def deleteMission(request, pk):
    mission = Mission.objects.get(id=pk)
    # Process data
    if request.method == 'POST':
        mission.delete()
        return redirect('home')
    context = {'mission': mission}
    return render(request, 'reseau/mission_delete.html', context)


def showMission(request, pk):
    mission = Mission.objects.get(id=pk)

    start = datetime(mission.startDate.year, mission.startDate.month, mission.startDate.day, mission.startTime.hour, mission.startTime.minute, mission.startTime.second)
    finish = datetime(mission.finishDate.year, mission.finishDate.month, mission.finishDate.day, mission.finishTime.hour, mission.finishTime.minute, mission.finishTime.second)

    durationWork = finish - start
    print(durationWork)
    total_seconds = int(durationWork.seconds)
    durationWorkHours = total_seconds // (60 * 60)
    durationWorkMinutes = (total_seconds % 3600) // 60
    if durationWorkMinutes < 10:
        durationWorkFormatted = f'{durationWorkHours}h0{durationWorkMinutes}'
    else:
        durationWorkFormatted = f'{durationWorkHours}h{durationWorkMinutes}'
    # durationWork.__class__.__name__
    context = {'mission': mission, 'durationWorkFormatted':durationWorkFormatted}
    return render(request, 'reseau/mission_show.html', context)


def allUsers(request):
    users = CustomUser.objects.all()
    context = {'users': users}
    return render(request, 'reseau/allusers.html', context)


def applyMission(request, pk):

    # Recuperer la reference de la mission 
    mission = Mission.objects.get(id=pk)

    # Recuperer une reference du candidat 
    candidate = request.user.worker

    # Ajouter le candidat a la liste des candidats
    mission.candidates.add(candidate)

    # Attribute directly to 1st candidate if express mission
    if mission.isExpress:
        mission.worker = candidate  
        mission.assigned = datetime.now();

        # Set the mission unavailable
        mission.available = False

    mission.save()  

    # return redirect('home')
    # return redirect(request.path)
    # return redirect('apply-mission', pk=pk) 
    return redirect('show-mission', pk=pk) 
    # return redirect('/some/url/')


def unapplyMission(request, pk):
    mission = Mission.objects.get(id=pk)

    candidate = request.user.worker

    print(" *** UNAPPLY *** ")
    if candidate in mission.candidates.all():
        print(" *** Candidate is in list *** ")
        mission.candidates.remove(candidate)

        if not(candidate in mission.candidates.all()):
            print(" *** Candidate removed in list *** ")

    # TO_UPDATE
    if mission.worker == candidate:
        mission.worker = None

    mission.save()


    # return redirect('home')
    return redirect('show-mission', pk=pk) 

    # context = {'mission': mission}
    # return render(request, 'reseau/mission_show.html', context)
    # return HttpResponseRedirect(request.path_info)


def appliersMission(request, pk):
    mission = Mission.objects.get(id=pk)
    context = {'mission': mission}
    return render(request, 'reseau/mission_appliers.html', context)


# Only the manager


def giveMission(request, missionPK, workerPK):

    print(missionPK)
    print(workerPK)

    # Get mission
    mission = Mission.objects.get(id=missionPK)
    print(mission)
    print(mission.structure)
    print(mission.available)

    # Get candidate
    candidate = Worker.objects.get(user_id=workerPK)
    print(candidate)

    # Give the candidate the mission
    print(mission.worker)
    mission.worker = candidate
    mission.assigned = datetime.now();
    print(mission.worker)

    # Set the mission unavailable
    mission.available = False

    print(mission.available)

    # 

    mission.save()

    context = {'mission': mission}
    return render(request, 'reseau/mission_appliers.html', context)


def removeMission(request, missionPK, workerPK):

    # Get mission
    mission = Mission.objects.get(id=missionPK)

    # Get candidate
    candidate = Worker.objects.get(user_id=workerPK)

    # Give the candidate the mission
    mission.worker = None

    # Set the mission available
    mission.available = True

    # print("Remove Mission !!! ")

    mission.save()

    context = {'mission': mission}
    return render(request, 'reseau/mission_appliers.html', context)


def workerMissions(request, pk):
    print(pk)

    # Get worker
    worker = Worker.objects.get(user_id=pk)
    print(worker)

    missions = worker.candidates.all()
    print(missions)

    context = {'missions': missions,
               'worker': worker}
    return render(request, 'reseau/worker_missions.html', context)


def workerAdmissions(request, pk):
    # print(type(pk))
    print('Worker PK = '+pk)

    # Get worker
    worker = Worker.objects.get(user_id=pk)
    # print(worker.structures_allowed.all())
    # print(type(worker.structure_id))
    print('WorkerFromStructure PK = '+str(worker.structure_id))

    # Get structures
    # structures = Structure.objects.all()
    structures = Structure.objects.exclude(id=worker.structure_id)
    # print(structures)

    # get ids of structures allowed to the worker
    subQuerySetStructuresAllowedID = worker.structures_allowed.values_list('id')

    # exclude structures allowed to the worker
    structures = structures.exclude(id__in=subQuerySetStructuresAllowedID)

    if request.method == 'POST':
        print(request.POST.get('structureSelect'))

        # Get structure code entered by worker
        getCodeStructureByWorker = request.POST.get('codeStructure')

        # Check if structure code is correct
        if getCodeStructureByWorker == request.POST.get('structureSelect'):

            # Get Structure
            structureAskedSelect = Structure.objects.get(
                code=request.POST.get('structureSelect'))
            print(structureAskedSelect)

            # send email
            to = request.POST.get('toemail')
            print(to)

            content = structureAskedSelect.name + ' : ' + structureAskedSelect.code
            print(content)

            #   add structure to allowed structures
            worker.structures_allowed.add(structureAskedSelect)
            worker.save()

            send_mail(
                # subject
                'Envoi admission',
                # msg
                content,
                # from email
                settings.EMAIL_HOST_USER,
                # recipient list emails
                [to]
            )
        else:
             messages.error(request, "Erreur dans le code de la structure saisi")


    # missions = worker.candidates.all()
    # print(missions)

    # admissions = worker.candidates.all()
    # print(admissions)

    # admissionStructure = request.POST.get('username')

    # if request.user.is_authenticated:
    #     return redirect('gestionnaire')

    context = {'worker': worker,
               'structures': structures,
               #    'admissions': admissions
               'structures_allowed': worker.structures_allowed.all(),
               }
    return render(request, 'reseau/worker_admissions.html', context)

    # Create your views here.


def sendanemail(request):
    if request.method == 'POST':
        to = request.POST.get('toemail')
        content = request.POST.get('content')
        # print(to, content)
        send_mail(
            # subject
            'testing',
            # msg
            content,
            # from email
            settings.EMAIL_HOST_USER,
            # recipient list emails
            [to]
        )
        return render(
            request,
            'reseau/email.html',
            {
                'title': 'send an email'
            }
        )
    else:
        return render(
            request,
            'reseau/email.html',
            {
                'title': 'send an email'
            }
        )
