import logging
from django.core.cache import cache
from django.conf import settings
from django.core.mail import send_mail
from django.http import HttpResponseForbidden
from regulations.models import SuspiciousLog
from regulations.utils.ip import get_client_ip

logger = logging.getLogger(__name__)

class SuspiciousActivityMiddleware:
    EXEMPT_IPS = {"127.0.0.1", "::1"}

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

    def __call__(self, request):
        try:
            ip = get_client_ip(request)

            if self.is_googlebot(request) or ip in self.EXEMPT_IPS:
                return self.get_response(request)

            key = f"request_count_{ip}"
            request_count = cache.get(key, 0)

            suspicious_entry = SuspiciousLog.objects.filter(ip=ip).first()
            if suspicious_entry and suspicious_entry.blocked:
                logger.warning(f"🚨 Akses diblokir untuk IP: {ip}")
                return HttpResponseForbidden("🚨 Akses Diblokir: IP ini telah terdeteksi mencurigakan.")

            if request_count:
                cache.incr(key)
            else:
                cache.set(key, 1, timeout=60)

            if request_count >= 70:
                self.send_alert_email(ip, request_count)
                SuspiciousLog.objects.update_or_create(
                    ip=ip,
                    defaults={"count": request_count, "blocked": True}
                )
                logger.warning(f"🚨 IP {ip} diblokir setelah {request_count} request dalam 1 menit.")
                return HttpResponseForbidden("🚨 Akses Diblokir: Terlalu banyak permintaan.")

            return self.get_response(request)

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

    def is_googlebot(self, request):
        user_agent = request.META.get('HTTP_USER_AGENT', '').lower()
        return "googlebot" in user_agent

    def send_alert_email(self, ip, count):
        try:
            subject = "🚨 Peringatan: Aktivitas Mencurigakan Terdeteksi"
            message = f"Ada aktivitas mencurigakan dari IP: {ip} dengan {count} akses dalam 1 menit."
            recipient_list = ["adillrahmat21@gmail.com"]

            logger.info(f"📧 Mengirim email peringatan untuk IP {ip}")

            send_mail(
                subject,
                message,
                settings.DEFAULT_FROM_EMAIL,
                recipient_list,
                fail_silently=False,
            )

            logger.info("✅ Email berhasil dikirim!")

        except Exception:
            logger.exception("⚠️ Gagal mengirim email peringatan")
