# from django.db.utils import IntegrityError
# from django.http import Http404
# from django.shortcuts import render
# import logging

# # Set up logging
# logger = logging.getLogger(__name__)

# class ServiceUnavailableException(Exception):
#     """Custom exception for service unavailability."""
#     pass

# class HandleAllErrorsMiddleware:
#     def __init__(self, get_response):
#         self.get_response = get_response

#     def __call__(self, request):
#         # Get user roles from session
#         admin = request.session.get('admin')
#         gate_keeper = request.session.get('gate_keeper')
#         employee = request.session.get('employee')

#         try:
#             # Process the request
#             response = self.get_response(request)
#             return response
#         except IntegrityError as e:
#             logger.error(f"IntegrityError occurred: {str(e)}")
#             return render(request, 'error.html', {
#                 'error_message': f"Database Error: {str(e)}",
#                 'status': '500',
#                 'admin': admin,
#                 'gate_keeper': gate_keeper,
#                 'employee': employee
#             }, status=500)
#         except Http404 as e:
#             logger.error(f"Page not found: {str(e)}")
#             return render(request, 'error.html', {
#                 'error_message': "Page not found",
#                 'status': '404',
#                 'admin': admin,
#                 'gate_keeper': gate_keeper,
#                 'employee': employee
#             }, status=404)
#         except ServiceUnavailableException as e:
#             logger.error(f"Service unavailable: {str(e)}")
#             return render(request, 'error.html', {
#                 'error_message': "Service is temporarily unavailable. Please try again later.",
#                 'status': '503',
#                 'admin': admin,
#                 'gate_keeper': gate_keeper,
#                 'employee': employee
#             }, status=503)
#         except Exception as e:
#             logger.error(f"Unexpected error occurred: {str(e)}")
#             return render(request, 'error.html', {
#                 'error_message': f"An unexpected error occurred: {str(e)}",
#                 'status': '500',
#                 'admin': admin,
#                 'gate_keeper': gate_keeper,
#                 'employee': employee
#             }, status=500)

#     def process_exception(self, request, exception):
#         admin = request.session.get('admin')
#         gate_keeper = request.session.get('gate_keeper')
#         employee = request.session.get('employee')

#         if isinstance(exception, Http404):
#             logger.error(f"Page not found: {str(exception)}")
#             return render(request, 'error.html', {
#                 'error_message': "Page not found",
#                 'status': '404',
#                 'admin': admin,
#                 'gate_keeper': gate_keeper,
#                 'employee': employee
#             }, status=404)
#         elif isinstance(exception, IntegrityError):
#             logger.error(f"IntegrityError occurred: {str(exception)}")
#             return render(request, 'error.html', {
#                 'error_message': f"Database Error: {str(exception)}",
#                 'status': '500',
#                 'admin': admin,
#                 'gate_keeper': gate_keeper,
#                 'employee': employee
#             }, status=500)
#         elif isinstance(exception, ServiceUnavailableException):
#             logger.error(f"Service unavailable: {str(exception)}")
#             return render(request, 'error.html', {
#                 'error_message': "Service is temporarily unavailable. Please try again later.",
#                 'status': '503',
#                 'admin': admin,
#                 'gate_keeper': gate_keeper,
#                 'employee': employee
#             }, status=503)
#         else:
#             logger.error(f"Unexpected error occurred: {str(exception)}")
#             return render(request, 'error.html', {
#                 'error_message': f"An unexpected error occurred: {str(exception)}",
#                 'status': '500',
#                 'admin': admin,
#                 'gate_keeper': gate_keeper,
#                 'employee': employee
#             }, status=500)



from django.db.utils import (
    IntegrityError,
    OperationalError,
    ProgrammingError,
    InterfaceError,
    DataError
)
from django.http import Http404
from django.shortcuts import render
import logging

# Set up logging
logger = logging.getLogger(__name__)

class ServiceUnavailableException(Exception):
    """Custom exception for service unavailability."""
    pass

class HandleAllErrorsMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        # Get user roles from session
        admin = request.session.get('admin')
        gate_keeper = request.session.get('gate_keeper')
        employee = request.session.get('employee')

        try:
            # Process the request
            response = self.get_response(request)
            return response
        except IntegrityError as e:
            logger.error(f"IntegrityError occurred: {str(e)}")
            return self._handle_error(request, "Database Error: Integrity constraint violation.", 500, admin, gate_keeper, employee)
        except OperationalError as e:
            logger.error(f"OperationalError occurred: {str(e)}")
            return self._handle_error(request, "Operational Database Error: Please contact support.", 500, admin, gate_keeper, employee)
        except ProgrammingError as e:
            logger.error(f"ProgrammingError occurred: {str(e)}")
            return self._handle_error(request, "Programming Error: An issue occurred with the database query.", 500, admin, gate_keeper, employee)
        except InterfaceError as e:
            logger.error(f"InterfaceError occurred: {str(e)}")
            return self._handle_error(request, "Database Interface Error: Connection issue detected.", 500, admin, gate_keeper, employee)
        except DataError as e:
            logger.error(f"DataError occurred: {str(e)}")
            return self._handle_error(request, "Data Error: Invalid or corrupted data encountered.", 500, admin, gate_keeper, employee)
        except Http404 as e:
            logger.error(f"Page not found: {str(e)}")
            return self._handle_error(request, "Page not found", 404, admin, gate_keeper, employee)
        except ServiceUnavailableException as e:
            logger.error(f"Service unavailable: {str(e)}")
            return self._handle_error(request, "Service is temporarily unavailable. Please try again later.", 503, admin, gate_keeper, employee)
        except Exception as e:
            logger.error(f"Unexpected error occurred: {str(e)}")
            return self._handle_error(request, f"An unexpected error occurred: {str(e)}", 500, admin, gate_keeper, employee)

    def process_exception(self, request, exception):
        """Optional: Handle uncaught exceptions that occur outside of the main request flow."""
        admin = request.session.get('admin')
        gate_keeper = request.session.get('gate_keeper')
        employee = request.session.get('employee')

        if isinstance(exception, Http404):
            logger.error(f"Page not found: {str(exception)}")
            return self._handle_error(request, "Page not found", 404, admin, gate_keeper, employee)
        elif isinstance(exception, IntegrityError):
            logger.error(f"IntegrityError occurred: {str(exception)}")
            return self._handle_error(request, "Database Error: Integrity constraint violation.", 500, admin, gate_keeper, employee)
        elif isinstance(exception, OperationalError):
            logger.error(f"OperationalError occurred: {str(exception)}")
            return self._handle_error(request, "Operational Database Error: Please contact support.", 500, admin, gate_keeper, employee)
        elif isinstance(exception, ProgrammingError):
            logger.error(f"ProgrammingError occurred: {str(exception)}")
            return self._handle_error(request, "Programming Error: An issue occurred with the database query.", 500, admin, gate_keeper, employee)
        elif isinstance(exception, InterfaceError):
            logger.error(f"InterfaceError occurred: {str(exception)}")
            return self._handle_error(request, "Database Interface Error: Connection issue detected.", 500, admin, gate_keeper, employee)
        elif isinstance(exception, DataError):
            logger.error(f"DataError occurred: {str(exception)}")
            return self._handle_error(request, "Data Error: Invalid or corrupted data encountered.", 500, admin, gate_keeper, employee)
        elif isinstance(exception, ServiceUnavailableException):
            logger.error(f"Service unavailable: {str(exception)}")
            return self._handle_error(request, "Service is temporarily unavailable. Please try again later.", 503, admin, gate_keeper, employee)
        else:
            logger.error(f"Unexpected error occurred: {str(exception)}")
            return self._handle_error(request, f"An unexpected error occurred: {str(exception)}", 500, admin, gate_keeper, employee)

    def _handle_error(self, request, error_message, status, admin, gate_keeper, employee):
        """Helper function to render error pages with consistent formatting."""
        return render(request, 'error.html', {
            'error_message': error_message,
            'status': str(status),
            'admin': admin,
            'gate_keeper': gate_keeper,
            'employee': employee
        }, status=status)
