import re
import logging
from django.http import HttpResponseForbidden
from regulations.utils.ip import get_client_ip

logger = logging.getLogger(__name__)

class BlockScraperMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response
        self.bot_patterns = [
            re.compile(r'bot', re.I),
            re.compile(r'scrapy', re.I),
            re.compile(r'crawl', re.I),
            re.compile(r'python-requests', re.I),
            re.compile(r'beautifulsoup', re.I),
            re.compile(r'curl', re.I),
            re.compile(r'wget', re.I),
            re.compile(r'spider', re.I),
            re.compile(r'selenium', re.I),
            re.compile(r'python-urllib', re.I),
            re.compile(r'java', re.I),
            re.compile(r'ruby', re.I),
            re.compile(r'php', re.I),
            re.compile(r'go-http-client', re.I),
            re.compile(r'node.js', re.I),
        ]
        self.excluded_agents = ["googlebot", "bingbot"]
        self.excluded_ips = ["127.0.0.1", "localhost"]

    def __call__(self, request):
        try:
            user_agent = request.META.get("HTTP_USER_AGENT", "").lower()
            client_ip = get_client_ip(request)

            if client_ip in self.excluded_ips or any(bot in user_agent for bot in self.excluded_agents):
                logger.info(f"✅ Dikecualikan dari blokir: {client_ip} - {user_agent}")
                return self.get_response(request)

            logger.info(f"User-Agent: {user_agent}")

            if any(pattern.search(user_agent) for pattern in self.bot_patterns):
                logger.warning(f"❌ Bot terdeteksi dan diblokir: {user_agent}")
                return HttpResponseForbidden("Access Denied")

            return self.get_response(request)

        except Exception:
            logger.exception("⚠️ Error in BlockScraperMiddleware")
            return self.get_response(request)
