'''
Ce fichier traite tout ce qui est lié à la gestion des
messages envoyé par un utilisateur.
'''


from pymongo import MongoClient
import json
from bson import ObjectId
import re
from datetime import datetime
import prj_common as mycommon
import secrets
import inspect


class JSONEncoder(json.JSONEncoder):
    def default(self, o):
        if isinstance(o, ObjectId):
            return str(o)
        return json.JSONEncoder.default(self, o)

CONNECTION_STRING = "mongodb://localhost/cherifdb"
client = MongoClient(CONNECTION_STRING)
dbname = client['cherifdb']


'''
Ajout du message d'un utilisateur 
'''
def add_user_message(diction):
    try:
        '''
        # Verification que les champs reçus dans l'API sont bien dans la liste des champs autorisés
        # Cela evite le cas ou une entité tierce ajouter les valeurs inconnu dans l'API
        # Ici on doit mettre tous les champs possible (obligatoire ou non) de la BDD dans la liste
        # field_list.
        '''
        field_list = ['type', 'sender_mail', 'sender_tel', 'recever_mail', 'recever_tel', 'object', 'message',  'token']
        incom_keys = diction.keys()
        for val in incom_keys:
            if val not in field_list:
                mycommon.myprint(str(inspect.stack()[0][
                                         3]) + " - Creation formation : Le champ  '" + val + "' n'existe pas, Creation formation annulée")
                return False, "Impossible d'ajouter le message"

        '''
        Une fois qu'on a controlé que toutes les clés mise dans l'API sont correcte. etape precedente,
        On controle que les champs obligatoires sont presents dans la liste 
        '''
        field_list_obligatoire = ['sender_mail', 'sender_tel', 'recever_mail', 'recever_tel', 'message', 'object', 'token']

        for val in field_list_obligatoire:
            if val not in diction:
                mycommon.myprint(
                    str(inspect.stack()[0][3]) + " - La valeur '" + val + "' n'est pas presente dans liste ")
                return False, "Impossible d'ajouter le message"

        # recuperation des paramettre
        user_recid = "None"
        token = ""
        new_diction = {}
        new_diction['user_recid'] = ""

        if ("token" in diction.keys()):
            if diction['token']:
                token = diction['token']
                new_diction['token'] =  diction['token']

        # Verification de la validité du token dans le cas des user en mode connecté
        if (len(str(token)) > 0):
            retval = mycommon.check_token_validity("", token)

            if retval is False:
                mycommon.myprint(str(inspect.stack()[0][3]) + " - Le token n'est pas valide")
                return False, "Impossible d'ajouter le message"

            # Recuperation du recid de l'utilisateur
            user_recid = mycommon.get_user_recid_from_token(token)
            if user_recid is False:
                mycommon.myprint(
                    str(inspect.stack()[0][3]) + " - Impossible de recuperer le token de l'utilisateur")
                return False, "Impossible d'ajouter le message"

        if ("type" in diction.keys()):
            if diction['type']:
                new_diction['type'] =  diction['type']

        if ("sender_mail" in diction.keys()):
            if diction['sender_mail']:
                new_diction['sender_mail'] =  diction['sender_mail']

        if ("sender_tel" in diction.keys()):
            if diction['sender_tel']:
                new_diction['sender_tel'] =  diction['sender_tel']

        if ("recever_mail" in diction.keys()):
            if diction['recever_mail']:
                new_diction['recever_mail'] =  diction['recever_mail']

        if ("object" in diction.keys()):
            if diction['object']:
                new_diction['object'] =  diction['object']


        if ("message" in diction.keys()):
            if diction['message']:
                new_diction['message'] =  diction['message']

        new_diction['user_recid'] = user_recid
        new_diction['sent'] = '0'
        new_diction['valide'] = '1'

        coll_name = dbname['user_message']
        ret_val = coll_name.insert_one(new_diction)

        if ret_val and ret_val.inserted_id:
            nb_doc = ret_val.inserted_id
            mycommon.myprint("Le message a été  bien enregistrée. Id message = '" + str(nb_doc) + "' ")
            return True, "Le message a été  bien enregistrée"
        else:
            return False, "Impossible d'ajouter le message"


    except Exception as e:
        exc_type, exc_obj, exc_tb = sys.exc_info()
        mycommon.myprint(str(inspect.stack()[0][3]) + " -" + str(e) + " - Line : " + str(exc_tb.tb_lineno))
        return False, "Impossible d'ajouter le message"



