import logging
import traceback

from django.http import JsonResponse


logger = logging.getLogger(__name__)


class ExceptionMiddleware:
    """
    Middleware to catch exceptions and handle them with appropriate logging and JSON response.
    """

    def __init__(self, get_response):
        """
        Initializes the ExceptionMiddleware with the provided get_response function.
        """
        self.get_response = get_response

    def __call__(self, request):
        """
        Process the request and call the next middleware or view function in the chain.
        """
        response = self.get_response(request)
        return response

    def process_exception(self, request, exception):
        """
        Called when a view function raises an exception.
        """
        error_type = exception.__class__.__name__
        error_message = exception.args
        logger.info(f"Error Type: {error_type} | Error Message: {error_message}")
        logger.debug("Request Details: %s", request.__dict__)
        logger.exception(traceback.format_exc())

        if isinstance(exception, KeyError):
            status_code = 400
            message = f"Please Add Valid Data For {error_message[0]}"
            error = "BAD_REQUEST"
        elif isinstance(exception, AttributeError):
            status_code = 500
            message = "Something Went Wrong. Please try again."
            error = "SOMETHING_WENT_WRONG"
        elif isinstance(exception, TypeError):
            status_code = 500
            message = "Something Went Wrong. Please try again."
            error = "SOMETHING_WENT_WRONG"
        else:
            status_code = 500
            message = "Something Went Wrong. Please try again."
            error = "SOMETHING_WENT_WRONG"

        return JsonResponse({"message": message, "error": repr(exception)}, status=status_code)