from django import forms
from django.contrib.auth import get_user_model

from .models import Evento
from .models import ListaEspera
from .models import Reserva

User = get_user_model()

class ReservaForm(forms.ModelForm):
    acompanante = forms.ModelChoiceField(
        queryset=User.objects.none(),
        required=False,
        label="Acompañante"
    )

    class Meta:
        model = Reserva
        fields = ['acompanante']

    def __init__(self, *args, **kwargs):
        evento = kwargs.pop('evento', None)
        usuario = kwargs.pop('usuario', None)
        super().__init__(*args, **kwargs)

        # Solo permitir elegir acompañante si el evento es para parejas
        if evento and evento.para_parejas:
            # Excluir usuarios que ya tienen reserva o están en lista de espera
            usuarios_excluidos = set(
                Reserva.objects.filter(evento=evento).values_list('usuario_id', flat=True)
            ) | set(
                ListaEspera.objects.filter(evento=evento).values_list('usuario_id', flat=True)
            )

            # Ordenar alfabéticamente por nombre y excluir al propio usuario
            self.fields['acompanante'].queryset = (
                User.objects.exclude(id__in=usuarios_excluidos)
                .exclude(id=usuario.id)
                .filter(is_active=True)
                .order_by('nombre')
            )

            # Mostrar el nombre completo o username en las opciones
            self.fields['acompanante'].label_from_instance = (
                lambda obj: f"{obj.nombre}"
            )

            # Hacer el campo obligatorio
            self.fields['acompanante'].required = True

        else:
            # Si no es evento de parejas, ocultamos el campo
            self.fields.pop('acompanante')

            
class EventoForm(forms.ModelForm):
    class Meta:
        model = Evento
        fields = ['nombre', 'descripcion', 'fecha', 'hora', 'plazas_disponibles', 'publicado', 'para_parejas']

        widgets = {
            'fecha': forms.DateInput(attrs={'type': 'date'}),
            'hora': forms.TimeInput(attrs={'type': 'time'}),
        }


class ListaEsperaForm(forms.ModelForm):
    acompanante = forms.ModelChoiceField(
        queryset=User.objects.none(),
        required=False,
        label="Acompañante"
    )

    class Meta:
        model = ListaEspera
        fields = ['acompanante']

    def __init__(self, *args, **kwargs):
        evento = kwargs.pop('evento', None)
        usuario = kwargs.pop('usuario', None)
        super().__init__(*args, **kwargs)

        # Solo permitir elegir acompañante si el evento es para parejas
        if evento and evento.para_parejas:
            # Excluir usuarios que ya tienen reserva o están en lista de espera
            usuarios_excluidos = set(
                Reserva.objects.filter(evento=evento).values_list('usuario_id', flat=True)
            ) | set(
                ListaEspera.objects.filter(evento=evento).values_list('usuario_id', flat=True)
            )

            # Ordenar alfabéticamente por nombre y excluir al propio usuario
            self.fields['acompanante'].queryset = (
                User.objects.exclude(id__in=usuarios_excluidos)
                .exclude(id=usuario.id)
                .filter(is_active=True)
                .order_by('nombre')
            )

            # Mostrar el nombre completo o username en las opciones
            self.fields['acompanante'].label_from_instance = (
                lambda obj: f"{obj.nombre}"
            )
        else:
            # Si no es evento de parejas, ocultamos el campo
            self.fields.pop('acompanante')  


class MensajeCorreoForm(forms.Form):
    asunto = forms.CharField(
        label="Asunto",
        max_length=200,
        required=True,
        widget=forms.TextInput(attrs={'class': 'form-control'})
    )

    mensaje = forms.CharField(
        label="Mensaje",
        widget=forms.Textarea(attrs={'class': 'form-control', 'rows': 16}),
        required=True
    )
