from django.contrib.auth.signals import user_logged_in, user_login_failed
from django.dispatch import receiver

from .models import LoginEvent


def _ip(request):
    forwarded = request.META.get("HTTP_X_FORWARDED_FOR", "")
    if forwarded:
        return forwarded.split(",")[0].strip()
    return request.META.get("REMOTE_ADDR")


@receiver(user_logged_in)
def record_login(sender, request, user, **kwargs):
    LoginEvent.objects.create(
        user=user,
        username_tried=user.get_username(),
        ip_address=_ip(request),
        user_agent=request.META.get("HTTP_USER_AGENT", "")[:300],
        successful=True,
    )


@receiver(user_login_failed)
def record_failure(sender, credentials, request=None, **kwargs):
    if request is None:
        return
    LoginEvent.objects.create(
        username_tried=credentials.get("username", "")[:150],
        ip_address=_ip(request),
        user_agent=request.META.get("HTTP_USER_AGENT", "")[:300],
        successful=False,
    )
