"""
Also record Django admin (superuser) logins in the same login_logs table,
so the log report covers the app's 3 roles AND the /admin/ panel.
"""
from django.contrib.auth.signals import (
    user_logged_in,
    user_logged_out,
    user_login_failed,
)
from django.dispatch import receiver

from .models import LoginLog


def _client_ip(request):
    if request is None:
        return None
    forwarded = request.META.get('HTTP_X_FORWARDED_FOR')
    if forwarded:
        return forwarded.split(',')[0].strip()
    return request.META.get('REMOTE_ADDR')


def _user_agent(request):
    if request is None:
        return ''
    return request.META.get('HTTP_USER_AGENT', '')[:255]


@receiver(user_logged_in)
def log_django_admin_login(sender, request, user, **kwargs):
    LoginLog.objects.create(
        email_attempted=user.email or user.get_username(),
        role_name='DJANGO_ADMIN',
        status='SUCCESS',
        ip_address=_client_ip(request),
        user_agent=_user_agent(request),
        message='Django admin login',
    )


@receiver(user_logged_out)
def log_django_admin_logout(sender, request, user, **kwargs):
    if user is None:
        return
    LoginLog.objects.create(
        email_attempted=user.email or user.get_username(),
        role_name='DJANGO_ADMIN',
        status='LOGOUT',
        ip_address=_client_ip(request),
        user_agent=_user_agent(request),
        message='Django admin logout',
    )


@receiver(user_login_failed)
def log_django_admin_failed(sender, credentials, request, **kwargs):
    LoginLog.objects.create(
        email_attempted=credentials.get('username', '')[:150],
        role_name='DJANGO_ADMIN',
        status='FAILED',
        ip_address=_client_ip(request),
        user_agent=_user_agent(request),
        message='Django admin login failed',
    )