# usuarios/services.py

from django.core.validators import validate_email
from django.core.exceptions import ValidationError 
from django.db import transaction
from django.contrib.auth.hashers import make_password # Importación necesaria para hashear contraseñas
from usuarios.models import Usuario
from .email_services import send_invitation_email_service 

# NOTA: La contraseña por defecto se generará dentro de invite_new_user
# usando el valor temporal de 'cc'.

# Funciones de utilidad y autenticación previas (omitidas por brevedad)...
# ...

def invite_new_user(email: str, invitation_url: str):
    
    email = email.strip().lower()

    if not email:
        raise ValueError("El correo es requerido.")
    
    # 1. Validación de Formato de Correo
    try:
        validate_email(email)
    except ValidationError:
        raise ValueError("Correo electrónico inválido.")

    # 2. Usar una transacción atómica
    with transaction.atomic():
        
        # 3. Verificar si el usuario ya existe
        if Usuario.objects.filter(correo=email).exists():
            raise ValueError(f"El correo ya está registrado: {email}.")
        
        # --- Generación de Campos Obligatorios Temporales ---
        
        # 4. Asignamos el valor temporal para 'cc' (Cédula/Documento)
        # ESTO ES TEMPORAL y asume que el usuario actualizará esto al registrarse.
        temp_cc = 0 
        
        # 5. Generar el hash de la contraseña usando el valor de 'cc' como base
        # Convertimos 'cc' a string para hashearla, aunque es un BigIntegerField
        temp_password_hash = make_password(str(temp_cc)) 
        
        # 6. Crear el usuario en la DB con valores por defecto y temporales
        try:
            usuario = Usuario.objects.create(
                correo=email,
                nombre="Invitado Pendiente", 
                estado=0, # Pendiente de activación
                tipo=1, # Asumimos tipo 1 para invitados
                contrasena=temp_password_hash, # Contraseña: Hash de '0'
                cc=temp_cc, # Cédula: 0
            )
        except Exception as e:
            print(f"Error en la creación de DB: {e}")
            raise Exception("No se pudo crear el registro de usuario en la base de datos.")

        # 7. Enviar el correo de invitación (Orquestación)
        try:
            send_invitation_email_service(usuario.correo, invitation_url)
        except Exception as e:
            # Si el correo falla, la transacción se revierte
            raise Exception(f"Error al enviar la invitación por correo: {e}")

        return usuario