from django.http import JsonResponse
import os
import requests
from django.conf import settings

from . import models as po_models

class SecureHeaderMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):

        if request.path.startswith('/po_service/update_delivery_status/'):
            return self.get_response(request)
        if request.path.startswith('/po_service/serve-file/') or request.path.startswith('/po_service/serve-order-file/') or request.path.startswith('/po_service/serve_image_file/') or request.path.startswith('/po_service/serve_doc/' or request.path.startswith('/eud_doc/')):  # Adjust this to your actual login endpoint
            return self.get_response(request)
        if request.path.startswith('/po_service/medias/'):  # Adjust this to your actual login endpoint
            return self.get_response(request)
        if request.path.startswith('/po_service/send_loadplan_mail/'): 
            return self.get_response(request)
        if request.path.startswith('/po_service/sync_price_master/'):
            return self.get_response(request)
        
        # Example: Validate API Key header
        api_key = request.headers.get('x-api-key')
        content_type = request.headers.get('x-content-type')
        auth_token = request.headers.get('x-auth-token')
        if request.path.startswith('/po_service/sync_price_master/'):  # Adjust this to your actual sync path
            return self.get_response(request)

        internal_paths = [
            '/po_service/migrate_orders/',  
            '/po_service/migrate_order_requests/',
        ]
        if request.path.startswith(settings.MEDIA_URL):
            return self.get_response(request)

        if any(request.path.startswith(path) for path in internal_paths):
            return self.get_response(request)

        # Validate API Key
        if not api_key or api_key != os.getenv('API_KEY'):
            return JsonResponse(
                {
                    'status_code': 403,
                    'status': 'error',
                    'message': 'Invalid or missing API Key',
                    'details': 'The APIs ssss key provided is either missing or invalid. Please provide a valid API key.'
                },
                status=403
            )

        # Validate Content-Type
        if not content_type or content_type != 'application/json':
            return JsonResponse(
                {
                    'status_code': 403,
                    'status': 'error',
                    'message': 'Invalid or missing Content-Type',
                    'details': 'The Content-Type header is either missing or not set. Please set it correctly.'
                },
                status=403
            )
        if not auth_token:
            return JsonResponse(
                {
                    'status_code': 403,
                    'status': 'error',
                    'message': 'Missing auth token',
                    'details': 'Auth token is missing. Please provide a valid auth token.'
                },
                status=403
            )
        api_url = settings.USER_API_URL + "validate_auth_token/"
        headers = {
            'x-api-key': settings.API_KEY,
            'x-content-type': 'application/json'
        }
        payload = {"auth_token": auth_token}
        try:
            response = requests.post(api_url, json=payload, headers=headers)

            if response.status_code != 200:
                return JsonResponse(
                    {
                        'status_code': 403,
                        'status': 'error',
                        'message': 'Invalid or expired auth token',
                        'details': 'The  token you are provided is invalid or expired. Please provide a valid auth token.'
                    },
                    status=403
                )
            elif response.status_code == 200:
                request.login_user_email = response.json().get('email')
                request.login_user_name = response.json().get('name')
                request.login_user_role = response.json().get('role')
                request.login_user_id = response.json().get('user_id')
                request.is_test_user = response.json().get('is_test_user')
                request.is_test_user = response.json().get('is_test_user')

        except Exception as e:
            return JsonResponse(
                {
                    'status_code': 500,
                    'status': 'error',
                    'message': 'An error occurred while validating the token',
                    'details': str(e)
                },
                status=500
            )
        return self.get_response(request)





class MediaCorsMiddleware:
    """Add CORS headers to media files"""
    
    def __init__(self, get_response):
        self.get_response = get_response
    
    def __call__(self, request):
        response = self.get_response(request)
        
        # Add CORS headers for media and static files
        if request.path.startswith('/po_service/media/') or request.path.startswith('/po_service/static/'):
            response['Access-Control-Allow-Origin'] = '*'
            response['Access-Control-Allow-Methods'] = 'GET, HEAD, OPTIONS'
            response['Access-Control-Allow-Headers'] = '*'
            response['Cross-Origin-Resource-Policy'] = 'cross-origin'
            response['Access-Control-Expose-Headers'] = 'Content-Length, Content-Type'
        
        return response