# -*-coding:utf8 -*
"""Fenêtre de rapide : Vue"""
#TODO: Rajouter une checkbox pour ajout d'une entrée de temps manuel (sans chrono)
#TODO: Passer toutes les vérifications des champs dans le controleur


import sys
import os
from tkinter import *
from datetime import datetime, timedelta
DOSSIER_COURRANT = os.path.dirname(os.path.abspath(__file__))
DOSSIER_PARENT = os.path.dirname(DOSSIER_COURRANT)
sys.path.append(DOSSIER_PARENT)
from DB.dbLink import DBLink as db
from Controllers.TasksController import TasksController as TasksCont



class QuickTask:
    """Fenêtre d'ajout rapide de tâche"""

    def __init__(self, mother, project_name='Sélectionner...', activate=False):
        #Initialisation des variables
        QuickTask.activate = activate
        link = db() #On aura besoin de la BDD pour récupérer projets et types

        QuickTask.fenetre = Toplevel(mother)
        QuickTask.fenetre.title("Tâche rapide")

        ###Titre
        Label(QuickTask.fenetre, text="Ajout d'une tâche").pack()
        self.msg = Label(QuickTask.fenetre, text='')
        self.msg.pack()

        ###Champ de projet
        Label(QuickTask.fenetre, text="Nom du projet :").pack()
        # Create a Tkinter variable
        QuickTask.project = StringVar(QuickTask.fenetre)
        self.proj_choices = dict()
        #Récupération des types et insertion comme options
            # Attention : si deux projets ouverts ont le même intitulé,
            # seul le plus récent sera pris en compte
        projects = link.query("SELECT IDProj, Intitulé FROM projet WHERE IDStat = 1", []).fetchall()
        for elem in projects:
            self.proj_choices[elem[1]] = elem[0]

        QuickTask.project.set(project_name) # set the default option
        OptionMenu(QuickTask.fenetre, QuickTask.project, *self.proj_choices).pack()

        ###Champ de type
            # Create a Tkinter variable
        QuickTask.type_value = StringVar(QuickTask.fenetre)
        self.ty_choices = dict()
            #Récupération des types et insertion comme options
        types = link.query("SELECT * FROM type ", []).fetchall()
        for elem in types:
            self.ty_choices[elem[1]] = elem[0]

        QuickTask.type_value.set("Sélectionner...") # set the default option
        Label(QuickTask.fenetre, text="Type de tâche :").pack()
        OptionMenu(QuickTask.fenetre, QuickTask.type_value, *self.ty_choices).pack()

        ###Champ de description
        Label(QuickTask.fenetre, text="Description :").pack()
        QuickTask.input_desc = Entry(QuickTask.fenetre)
        QuickTask.input_desc.pack()

        ###Champ de commentaire
        Label(QuickTask.fenetre, text="Commentaire :").pack()
        QuickTask.input_comm = Text(QuickTask.fenetre, width=25, height=3)
        QuickTask.input_comm.pack()

        ###Minutes de décalage pour le bouton démarrer/arrêter
        Label(QuickTask.fenetre, text="Décalage : ").pack()
        self.min_label = Label(QuickTask.fenetre, text="Tâche commencée il y a ")
        self.min_label.pack()
        QuickTask.input_min = Entry(QuickTask.fenetre)
        QuickTask.input_min.insert(0, 0)
        QuickTask.input_min.pack()
        Label(QuickTask.fenetre, text="minute(s)").pack()

        ###Champs heures de début/fin
        Label(QuickTask.fenetre, text="Heure de début : ").pack()
        QuickTask.heure_debut = Entry(QuickTask.fenetre, state=DISABLED)
        QuickTask.heure_debut.pack()

        Label(QuickTask.fenetre, text="Heure de fin : ").pack()
        QuickTask.heure_fin = Entry(QuickTask.fenetre, state=DISABLED)
        QuickTask.heure_fin.pack()

        ###Bouton démarrer/arrêter
        QuickTask.start_stop = Button(QuickTask.fenetre, text="Démarrer", command=self.timer)
        QuickTask.start_stop.pack()

        #Bouton annuler
        QuickTask.cancel = Button(QuickTask.fenetre, command=self.stop, text="Annuler", state=DISABLED)
        QuickTask.cancel.pack()

    def timer(self):
        """Actions à engager lorsqu'on débute/arrête une tâche"""

        #Prise en compte du décalage de temps et remise à zéro du compteur
        decalage = int(QuickTask.input_min.get())

        #Action à déclencher en fonction de si on démarre ou finit l'enregistrement
        if not QuickTask.activate: #Si on démarre l'enregistrement
            #Gestion de l'heure de départ
            QuickTask.h_debut_value = datetime.now() - timedelta(minutes=decalage)
            QuickTask.heure_debut['state'] = NORMAL
            QuickTask.heure_debut.insert(0, QuickTask.h_debut_value.strftime('%H:%M'))
            QuickTask.heure_debut['state'] = DISABLED
            #Modification des labels
            QuickTask.start_stop['text'] = "Terminer"
            self.min_label['text'] = "Tâche terminée il y a "
            #On change le statut du bouton, on active l'annulation, on vide le champ décalage
            QuickTask.activate = not QuickTask.activate
            QuickTask.cancel['state'] = NORMAL
            QuickTask.input_min.delete(0, 'end')
            QuickTask.input_min.insert(0, 0)

        else: #Si on le finit
            #Vérifions que les champs sont bien remplis
            if QuickTask.project.get() != 'Sélectionner...' \
            and QuickTask.type_value.get() != 'Sélectionner...' \
            and QuickTask.input_desc.get() != '':
                #On gère l'heure de fin
                QuickTask.h_fin_value = datetime.now() - timedelta(minutes=decalage)
                #Et on vérifie que l'heure de début est inférieure à celle de fin
                ecart_temps =  QuickTask.h_fin_value - QuickTask.h_debut_value

                if QuickTask.h_fin_value > QuickTask.h_debut_value \
                and ecart_temps.seconds > 60:
                #tout est ok ?  on va enregistrer
                    #On modifie le champ d'heure de fin
                    QuickTask.heure_fin['state'] = NORMAL
                    QuickTask.heure_fin.insert(0, QuickTask.h_fin_value.strftime('%H:%M'))
                    QuickTask.heure_fin['state'] = DISABLED
                    #Et les labels
                    QuickTask.start_stop['text'] = "Démarrer"
                    self.min_label['text'] = "Tâche commencée il y a "
                    # appel à la fonction controleur enregistrant la tâche en BDD
                    controller = TasksCont()
                    controller.register(QuickTask.heure_debut.get(), QuickTask.heure_fin.get(),
                                        QuickTask.input_comm.get('1.0', 'end'),
                                        self.proj_choices[QuickTask.project.get()],
                                        QuickTask.input_desc.get(),
                                        self.ty_choices[QuickTask.type_value.get()])
                    #On change le statut du bouton et on vide les champs
                    QuickTask.activate = not QuickTask.activate
                    QuickTask.heure_debut['state'] = NORMAL
                    QuickTask.heure_debut.delete(0, 'end')
                    QuickTask.heure_debut['state'] = DISABLED
                    QuickTask.heure_fin['state'] = NORMAL
                    QuickTask.heure_fin.delete(0, 'end')
                    QuickTask.heure_fin['state'] = DISABLED
                    QuickTask.input_comm.delete('1.0', 'end')
                    QuickTask.input_min.delete(0, 'end')
                    QuickTask.input_min.insert(0, 0)

                    #Désactivation du bouton annuler et vidage de champs
                    QuickTask.cancel['state'] = DISABLED
                    QuickTask.input_desc.delete(0, 'end')

                    #On affiche un message disant OK
                    self.msg['text'] = "Tâche enregistrée"
                else:
                    self.msg['text'] = "L'heure de fin doit être supérieure ou égale à l'heure de début"

            else:
            #non ? on affiche un message et on valide rien du tout, namého
                self.msg['text'] = "Tous les champs doivent êtres remplis pour enregistrer la tâche"

    def stop(self):
        """Annulation d'une tâche démarrée"""

        #Gestion des labels
        QuickTask.start_stop['text'] = "Démarrer"
        self.min_label['text'] = "Tâche commencée il y a "
        #On change le statut du bouton et on vide les champs
        QuickTask.activate = not QuickTask.activate
        QuickTask.heure_debut['state'] = NORMAL
        QuickTask.heure_debut.delete(0, 'end')
        QuickTask.heure_debut['state'] = DISABLED
        #Désactivation du bouton annuler
        QuickTask.cancel['state'] = DISABLED

        #AFfichage du message
        self.msg['text'] = "Enregistrement de la tâche annulé"