from django.conf import settings
from django.contrib.auth import get_user_model
from django.db.models.signals import post_save
from django.dispatch import receiver
from allauth.account.signals import user_signed_up

from .models import Profile
from core.models import UserWallet


@receiver(post_save, sender=settings.AUTH_USER_MODEL)
def create_user_profile_and_wallet(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(user=instance, display_name=instance.username)
        UserWallet.objects.create(user=instance)


@receiver(post_save, sender=settings.AUTH_USER_MODEL)
def save_user_profile(sender, instance, **kwargs):
    if hasattr(instance, "profile"):
        instance.profile.save()


@receiver(user_signed_up)
def assign_referral_code(request, user, **kwargs):
    ref_code = request.POST.get("ref") or request.GET.get("ref")
    if not ref_code:
        return

    User = get_user_model()
    try:
        referrer = User.objects.get(referral_code__iexact=ref_code)
    except User.DoesNotExist:
        return

    if referrer != user:
        user.referred_by = referrer
        user.save(update_fields=["referred_by"])
