from django.shortcuts import render, get_object_or_404
from .models import Event, Gallery, Testimonial, TestimonialImage, Category
from datetime import date  # Importez la classe date pour manipuler les dates
from django.db.models import Q
from .models import MessageContact
from .forms import ContactForm
from django.contrib.admin.views.decorators import staff_member_required
from django.shortcuts import render, get_object_or_404, redirect  # Ajoute redirect ici
from django.http import HttpResponse
from .models import AboutSection , Slider
from .models import AboutSection, Statistics,Partner, Reservation
from .forms import ReservationForm
from django.core.mail import send_mail
from django.conf import settings
from django.http import JsonResponse
from django.contrib.auth.decorators import login_required
from django.contrib.auth import authenticate, login, logout
from django.contrib.auth.models import User
from .models import VisitorUser
from django.shortcuts import render, redirect, get_object_or_404
from django.contrib import messages
from .models import VisitorUser
from .forms import ContactForm, ReservationForm
from .forms import VisitorUserProfileForm ,EventForm



def  about(request):
    about_section = AboutSection.objects.first()
    statistics = Statistics.objects.first()
    testimonials = Testimonial.objects.all()
    partners = Partner.objects.all()
    gallery = Gallery.objects.all()

    context = {
        'about_section': about_section,
        'statistics': statistics,
        'testimonials': testimonials,
        'partners': partners,
        'gallery': gallery,
    }
    return render(request, 'gestion/about.html', context)


def home(request):
    print(f"Utilisateur connecté : {request.user} (Authentifié: {request.user.is_authenticated})")
    
    form = ContactForm()
    events = Event.objects.all()
    gallery = Gallery.objects.all()
    testimonials = Testimonial.objects.prefetch_related('images').all()
    about_section = AboutSection.objects.first()
    sliders = Slider.objects.all()

    return render(request, 'gestion/index.html', {
        'events': events,
        'gallery': gallery,
        'testimonials': testimonials,
        'about_section': about_section,
        'sliders': sliders,
        'form':form,
    })



def event_list(request):
    # Récupère les événements futurs ou du jour même
    events = Event.objects.filter(Q(date__gt=date.today()) | Q(date=date.today()))

    # Récupère la catégorie sélectionnée depuis l'URL
    category_filter = request.GET.get('category', None)

    print(f"Catégorie sélectionnée : {category_filter}")  # Debug

    # Filtre les événements par catégorie si une catégorie est sélectionnée
    if category_filter and category_filter != 'all':
        events = events.filter(category=category_filter)
        print(f"Événements filtrés : {events}")  # Debug

    # Passe les événements et les catégories au template
    return render(request, 'gestion/eventlist.html', {
        'events': events,
        'categories': Event.CATEGORY_CHOICES
    })
    
def event_detail(request, id):
    event = get_object_or_404(Event, id=id)
    if request.method == 'POST':
        form = ReservationForm(request.POST)
        if form.is_valid():
            reservation = form.save(commit=False)
            reservation.event = event
            reservation.save()

            # Envoi de l'email de confirmation
            send_mail(
                'Confirmation de votre réservation',
                f'Bonjour {reservation.first_name} {reservation.last_name},\n\n'
                f'Votre réservation pour l\'événement "{event.title}" a bien été prise en compte.\n\n'
                f'Merci de votre confiance!',
                settings.DEFAULT_FROM_EMAIL,
                [reservation.email],
                fail_silently=False,
            )

            # Retourner une réponse JSON pour l'AJAX
            return JsonResponse({
                'success': True,
                'message': 'Votre réservation a été enregistrée avec succès. Vous recevrez un email de confirmation.'
            })

    else:
        form = ReservationForm()

    return render(request, 'gestion/event.html', {'event': event, 'form': form})

def reservation(request):
    if request.method == "POST":
        form = ReservationForm(request.POST)
        if form.is_valid():
            reservation = form.save()
            
            # Envoi de l'email de confirmation
            send_mail(
                subject="Confirmation de réservation",
                message=f"Merci {reservation.first_name}, votre réservation a été prise en compte.",
                from_email="contact@deltax.com",
                recipient_list=[reservation.email],
                fail_silently=False,
            )

            return JsonResponse({"success": True, "message": "Réservation réussie !"})

        else:
            return JsonResponse({"success": False, "message": "Erreur dans le formulaire.", "errors": form.errors.as_json()})

    return JsonResponse({"success": False, "message": "Méthode non autorisée."})

from django.shortcuts import render, redirect
from django.contrib import messages
from .models import Settings
from .forms import ContactForm

def contact(request):
    settings = Settings.objects.first()  # Récupérer les infos de contact

    if request.method == "POST":
        form = ContactForm(request.POST)

        if form.is_valid():
            form.save()  # Sauvegarde le message
            messages.success(request, "Votre message a été envoyé avec succès!")
        else:
            messages.error(request, "Erreur lors de l'envoi du formulaire.")

        # Redirection après soumission
        next_page = request.POST.get("next", request.path)
        return redirect(next_page)

    else:
        form = ContactForm()

    return render(request, "gestion/contact.html", {
        "form": form,
        "email": settings.email if settings else '',
        "phone_number": settings.phone_number if settings else '',
        "address": settings.address if settings else '',
    })


@staff_member_required
def admin_messages_view(request):
    messages = MessageContact.objects.all().order_by('-date_sent')  # Trier les messages du plus récent au plus ancien
    return render(request, "admin_messages.html", {"messages": messages})  # Afficher la page avec les messages

def about_view(request):
    about_section = AboutSection.objects.first()  # Récupère la première entrée
    return render(request, 'about.html', {'about_section': about_section})



def login_view(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')

        try:
            visitor = VisitorUser.objects.get(username=username)
            if visitor.check_password(password):  # Vérifie le hash du mot de passe
                login(request, visitor)  # Connexion manuelle pour VisitorUser
                messages.success(request, 'Connexion réussie !')
                return redirect('index')  # Redirection après connexion
            else:
                messages.error(request, 'Mot de passe incorrect.')
        except VisitorUser.DoesNotExist:
            messages.error(request, "Aucun compte trouvé avec ce nom d'utilisateur.")

    return render(request, 'gestion/login.html')

# Vue pour l'inscription des visiteurs
def register_view(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        email = request.POST.get('email')
        password = request.POST.get('password')
        confirm_password = request.POST.get('confirm_password')

        # Vérifier si les mots de passe correspondent
        if password != confirm_password:
            messages.error(request, "Les mots de passe ne correspondent pas.")
        elif VisitorUser.objects.filter(username=username).exists():
            messages.error(request, "Nom d'utilisateur déjà pris.")
        elif VisitorUser.objects.filter(email=email).exists():
            messages.error(request, "Email déjà utilisé.")
        else:
            visitor = VisitorUser(username=username, email=email)
            visitor.set_password(password)  # Hash du mot de passe
            visitor.save()
            messages.success(request, "Compte créé avec succès ! Vous pouvez vous connecter.")
            return redirect('login')

    return render(request, 'gestion/register.html')

@login_required
def profile_view(request):
    visitor = VisitorUser.objects.get(id=request.user.id)

    # Formulaire de profil
    if request.method == 'POST' and 'update_profile' in request.POST:
        form = VisitorUserProfileForm(request.POST, instance=visitor)
        if form.is_valid():
            form.save()
            messages.success(request, "Votre profil a été mis à jour avec succès.")
            return redirect('profile')
        else:
            messages.error(request, "Il y a une erreur dans le formulaire.")
    else:
        form = VisitorUserProfileForm(instance=visitor)

    # Formulaire d'ajout d'événement
    if request.method == 'POST' and 'add_event' in request.POST:
        event_form = EventForm(request.POST, request.FILES)
        if event_form.is_valid():
            event = event_form.save(commit=False)
            event.organizer = visitor  # Associer l'événement à l'utilisateur connecté
            event.save()
            messages.success(request, "L'événement a été ajouté avec succès !")
            return redirect('profile')
        else:
            messages.error(request, "Erreur dans le formulaire d'événement.")
    else:
        event_form = EventForm()

    return render(request, 'gestion/profile.html', {'form': form, 'visitor': visitor, 'event_form': event_form})



# Vue pour la déconnexion
def logout_view(request):
    logout(request)
    messages.success(request, 'Déconnexion réussie.')
    return redirect('index')  # Redirige après déconnexion

