import json
from django.core.mail import send_mail
import random
from rest_framework.views import exception_handler
from rest_framework.response import Response
from rest_framework import status
import os
from datetime import datetime
from django.conf import settings

# def manager_error(error_code, error_message=None, send_notification=False, register_error=True):
#     import traceback
#     import sys

#     error_messages = {
#         -2: "Une erreur critique est survenue",
#         -1: "Une erreur inattendue s'est produite", 
#         0: None, # Pas d'erreur
#         1: "Le traitement a été interrompu car trop volumineux",
#         2: "Le traitement est incomplet",
#         3: "Une erreur est survenue lors du traitement",
#         4: "Une erreur interne est survenue",
#         5: "Erreur interne - Contactez contact@ed-disce.fr si le problème persiste"
#     }

#     # Récupère la stack trace complète
#     stack_trace = traceback.format_exc()
    
#     # Affiche le message d'erreur et la stack trace
#     if error_message:
#         print(f"Erreur: {error_message}")
#         print("\nStack trace:")
#         print(stack_trace)
#     else:
#         error_msg = error_messages.get(error_code, "Erreur inconnue survenue")
#         print(f"Erreur (code {error_code}): {error_msg}")
#         print("\nStack trace:")
#         print(stack_trace)
    
#     # Ajouter ici éventuellement une partie qui enregistre les erreurs dans une base de donnée
#     # (On pourra ensuite ajouter un script qui envoie un mail tout les jours pour signaler les erreurs)

#     # Ajouter éventuellement ici une partie qui envoie un mail pour signaler l'erreur


# def handle_error(error_code, error_details=None, send_notification=True):
#     """
#     Gère les erreurs de manière centralisée.
    
#     Args:
#         error_code (int): Code d'erreur (-2 à 5)
#         error_details (dict, optional): Détails supplémentaires sur l'erreur
#         send_notification (bool): Si True, envoie une notification par email
        
#     Returns:
#         tuple: (message d'erreur pour l'utilisateur, code d'erreur)
#     """
    
#     # Dictionnaire des messages d'erreur
#     error_messages = {
#         -2: "Une erreur critique est survenue",
#         -1: "Une erreur inattendue s'est produite", 
#         0: None, # Pas d'erreur
#         1: "Le traitement a été interrompu car trop volumineux",
#         2: "Le traitement est incomplet",
#         3: "Une erreur est survenue lors du traitement",
#         4: "Une erreur interne est survenue",
#         5: "Erreur interne - Contactez contact@ed-disce.fr si le problème persiste"
#     }

#     # Génère un code de détection unique pour le suivi
#     detection_code = ''.join([str(random.randint(0, 9)) for _ in range(4)])
    
#     # Prépare le message d'erreur pour l'utilisateur
#     user_message = error_messages.get(error_code, "Erreur inconnue")
#     if error_code in [3, 4]:
#         user_message += f" (Code: {detection_code})"
        
#     # Envoie une notification par email si demandé
#     if send_notification and error_code in [-2, -1, 3, 4, 5]:
#         error_info = {
#             'error_code': error_code,
#             'detection_code': detection_code,
#             'details': error_details
#         }
        
#         send_mail(
#             subject=f"Erreur détectée (Code {detection_code})",
#             message=json.dumps(error_info, indent=2),
#             from_email='admin@ed-disce.fr',
#             recipient_list=['antoine@ed-disce.fr'],
#             fail_silently=False
#         )

#     # Retourne le message formaté pour l'interface utilisateur
#     return [{'ops': [{'insert': user_message, 'attributes': {'italic': True}}]}], error_code

# def custom_exception_handler(exc, context):
#     # Appel du gestionnaire d'exceptions par défaut
#     response = exception_handler(exc, context)
    
#     if response is not None:
#         # S'assurer que la réponse est en JSON
#         response.data = {
#             'error': str(exc),
#             'status_code': response.status_code
#         }
#         response.content_type = 'application/json'
    
#     return response


# Dictionnaire des messages d'erreur par status HTTP
STATUS_MESSAGES = {
    400: "Requête invalide - Les données envoyées sont incorrectes",
    401: "Non autorisé - Authentification requise", 
    403: "Accès refusé - Vous n'avez pas les permissions nécessaires",
    404: "Ressource non trouvée",
    405: "Méthode non autorisée",
    408: "Délai d'attente dépassé",
    429: "Trop de requêtes - Veuillez réessayer plus tard",
    500: "Erreur serveur interne",
    502: "Erreur de passerelle",
    503: "Service indisponible",
    504: "Délai de passerelle dépassé",
    0: "La requête a échouée sans renvoyer de message d'erreur",
    1: "Erreur non transmise"
}

# LEVELS = ["error", "warning", "info", "debug", "default"]

def write_error_log(user_pid, message, status = 1, code = 'default_code', level = 'error'):
    """Écrit un message d'erreur dans le fichier de log de l'utilisateur"""
    # Création du dossier journal s'il n'existe pas
    log_dir = os.path.join(settings.BASE_DIR, 'journal')
    os.makedirs(log_dir, exist_ok=True)
    
    # Chemin du fichier de log pour cet utilisateur
    log_file = os.path.join(log_dir, f'{user_pid}.log')
    
    # Récupération du message d'erreur personnalisé selon le status
    status_message = STATUS_MESSAGES.get(status, "Erreur inconnue")
    
    # Ajout du message d'erreur horodaté dans le fichier
    timestamp = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    log_entry = f"[{timestamp}] [{status}] [{status_message}] [{level}] [{code}] [{json.dumps(message)}]\n"
    
    with open(log_file, 'a', encoding='utf-8') as f:
        f.write(log_entry)
        
    return True