# class APILogMiddleware(MiddlewareMixin):
#     def process_response(self, request, response):
        
#         log_dir = "/home/nettyfy/visnx/visnx-backend/Nettyfy_visnx/myprofile/logs/api_logs"
#         os.makedirs(log_dir, exist_ok=True)
#         log_file = os.path.join(log_dir, "access_log.log")
#         api_name = request.path.replace('/', '_').strip('_')

#         # Configure logging
#         logger = logging.getLogger(api_name)
#         logger.setLevel(logging.INFO)
#         handler = logging.FileHandler(log_file)
#         handler.setFormatter(logging.Formatter('%(message)s'))
#         logger.addHandler(handler)
#         # Log the response status
        
#         log_data = {
#             "method": request.method,
#             "content_type":request.content_type,
#             "path": request.path,
#             "timestamp": str(datetime.now().date()),
#             "status_code": response.status_code,
#             "user": str(request.user),
#         }
#         logger.info(json.dumps(log_data, indent=4))


#         if response.status_code >= 400:
#             # logger.error(json.dumps(log_data, indent=4))

#             log_file = os.path.join(log_dir, "error_log.log")
#             api_name = request.path.replace('/', '_').strip('_')

#             # Configure logging
#             logger = logging.getLogger(api_name)
#             logger.setLevel(logging.ERROR)
#             handler = logging.FileHandler(log_file)
#             handler.setFormatter(logging.Formatter('%(message)s'))
#             logger.addHandler(handler)
#             log_data = {
#                 "method": request.method,
#                 "content_type":request.content_type,
#                 "path": request.path,
#                 "timestamp": str(datetime.now().date()),
#                 "status_code": response.status_code,
#                 "message": '',
#                 "user": str(request.user),
#             }
#             logger.error(json.dumps(log_data, indent=4))
#         else:
#             # logger.info(json.dumps(log_data, indent=4))
#             if request.method == "DELETE":
#                 log_file_delete = os.path.join(log_dir, "user_activity_delete_log.log")
#                 api_name_delete = request.path.replace('/', '_').strip('_')

#                 # Configure logging
#                 logger1 = logging.getLogger(api_name_delete)
#                 logger1.setLevel(logging.INFO)
#                 handler1 = logging.FileHandler(log_file_delete)
#                 handler1.setFormatter(logging.Formatter('%(message)s'))
#                 logger1.addHandler(handler1)
#                 delete_log_data = {
#                     "method": request.method,
#                     "content_type":request.content_type,
#                     "path": request.path,
#                     "timestamp": str(datetime.now().date()),
#                     "status_code": response.status_code,
#                     "message": response.data['message']+f' by {str(request.user)}.' if response.data['message'] else None,
#                     "user": str(request.user),
#                 }
#                 logger1.info(json.dumps(delete_log_data, indent=4))
#         return response

from datetime import datetime
import json
import os
from django.urls import resolve
from django.conf import settings

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

        # Define log file paths
        log_dir = os.path.join(os.path.dirname(__file__), 'logs')
        os.makedirs(log_dir, exist_ok=True)
        self.access_log_file = os.path.join(log_dir, 'api_logs/access_log.json')
        self.delete_log_file = os.path.join(log_dir, 'api_logs/delete_log.json')
        self.error_log_file = os.path.join(log_dir, 'api_logs/error_log.json')

        # Load existing logs or initialize empty lists
        # self.access_logs = self._load_logs(self.access_log_file)
        # self.delete_logs = self._load_logs(self.delete_log_file)
        # self.error_logs = self._load_logs(self.error_log_file)

    def _append_log(self, log_file, new_entry):
        """Safely append a new entry to a JSON log file"""
        try:
            if os.path.exists(log_file):
                # Read the existing logs first
                with open(log_file, 'r+') as f:
                    try:
                        logs = json.load(f)
                    except json.JSONDecodeError:
                        logs = []
            else:
                logs = []
            # Append new log entry to the logs
            logs.append(new_entry)

            # Write the updated logs back to the file
            with open(log_file, 'w') as f:
                json.dump(logs, f, indent=4)

        except Exception as e:
            print(f"Error writing to log file {log_file}: {e}")
            
    def __call__(self, request):
        # Resolve the path for logging purposes
        resolved_path = resolve(request.path)
        if resolved_path.app_name == 'admin':
            return self.get_response(request)
        response = self.get_response(request)
        
        if not request.user.is_anonymous:
            if request.user.first_name:
                username = request.user.first_name
            if request.user.last_name:
                username = request.user.last_name
            if request.user.first_name and request.user.last_name:
                username = request.user.first_name+' '+request.user.last_name
            if not request.user.first_name and not request.user.last_name:
                username = ''
        else:
            username = ''
        access_log_entry = {
            "method": request.method,
            "content_type": request.content_type,
            "path": settings.URL+''+request.path,
            "status_code": response.status_code,
            "date":str(datetime.now()),
            "user": username
        }
        self._append_log(self.access_log_file, access_log_entry)

        # # Write access logs to file
        # with open(self.access_log_file, 'w') as f:
        #     json.dump(self.access_logs, f, indent=4)

        # Log the error
        if response.status_code >= 400:
            error_log_entry = {
                "method": request.method,
                "content_type": request.content_type,
                "path": settings.URL+''+request.path,
                "status_code": response.status_code,
                "error": response.data['data'] if response.data else '',
                "date":str(datetime.now()),
                "user": username
            }
            # self.error_logs.append(error_log_entry)
            self._append_log(self.error_log_file, error_log_entry)

            # Write error logs to file
            # with open(self.error_log_file, 'w') as f:
            #     json.dump(self.error_logs, f, indent=4)
        
        # Specifically log DELETE requests
        if request.method == "DELETE":
            if response.status_code < 400:
                access_log_entry['status'] = 'Success'
            elif response.status_code >= 400:
                access_log_entry['status'] = 'Failed'
                access_log_entry['error'] = response.data['data'] if response.data else ''
            # self.delete_logs.append(access_log_entry)
            self._append_log(self.delete_log_file, access_log_entry)

            # Write delete logs to separate file
            # with open(self.delete_log_file, 'w') as f:
            #     json.dump(self.delete_logs, f, indent=4)
        return response
