import urllib.request
import io
import random
from PIL import Image
from django.core.files.base import ContentFile
from allauth.socialaccount.adapter import DefaultSocialAccountAdapter
from .models import UsuarioUtrau

class CustomSocialAccountAdapter(DefaultSocialAccountAdapter):
    
    # 1. ARMADO DEL USUARIO (En memoria, antes de guardar)
    def populate_user(self, request, sociallogin, data):
        user = super().populate_user(request, sociallogin, data)
        
        # Sincronizamos el nombre real
        nombre = data.get('name') or f"{data.get('first_name', '')} {data.get('last_name', '')}".strip()
        if nombre:
            user.nombre_completo = nombre
            
        # Alias inteligente
        email = data.get('email', '')
        if email and '@' in email:
            base_username = email.split('@')[0].lower().replace(".", "")
        else:
            base_username = nombre.replace(" ", "").lower()[:150] if nombre else f"user{random.randint(1000, 9999)}"
        
        # Verificamos si ese alias ya existe
        if UsuarioUtrau.objects.filter(username=base_username).exists():
            user.username = f"{base_username}{random.randint(100, 999)}"
        else:
            user.username = base_username
            
        return user

    # 2. DESCARGA DE FOTO (Después de que el usuario ya existe en la Base de Datos)
    def save_user(self, request, sociallogin, form=None):
        # Guardamos al usuario para que Django le asigne su ID oficial
        user = super().save_user(request, sociallogin, form)
        
        # Buscamos la URL de la foto directo en la metadata profunda (más seguro)
        foto_url = None
        if sociallogin.account.provider == 'google':
            foto_url = sociallogin.account.extra_data.get('picture')
        elif sociallogin.account.provider == 'facebook':
            foto_url = sociallogin.account.extra_data.get('picture', {}).get('data', {}).get('url')
        
        # Ejecutamos tu magia de optimización ahora que el user tiene ID
        if foto_url and not user.foto_perfil:
            try:
                req = urllib.request.Request(foto_url, headers={'User-Agent': 'Mozilla/5.0'})
                with urllib.request.urlopen(req) as response:
                    if response.status == 200:
                        img = Image.open(io.BytesIO(response.read()))
                        if img.mode != 'RGB':
                            img = img.convert('RGB')
                        
                        img.thumbnail((400, 400), Image.Resampling.LANCZOS)
                        
                        output = io.BytesIO()
                        img.save(output, format='WEBP', quality=85)
                        
                        nombre_archivo = f"avatar_social_{user.id}.webp"
                        # ¡Acá está la clave! save=True ahora funciona perfecto
                        user.foto_perfil.save(nombre_archivo, ContentFile(output.getvalue()), save=True)
            except Exception as e:
                print(f"Error procesando foto social: {e}")
                
        return user