from django.views.generic import TemplateView, FormView
from django.urls import reverse_lazy
from django.contrib import messages
from django.http import JsonResponse
from apps.core.views import CMSPageMixin
from traduction.helpers import prefetch_translations
from .models import ContactInfo, UniversityContact
from .forms import ContactForm, NewsletterForm


class ContactView(CMSPageMixin, FormView):
    """
    Page de contact.

    Utilise le template CMS si une page 'contact' existe.
    """
    template_name = 'contact/contact.html'
    form_class = ContactForm
    success_url = reverse_lazy('contact:success')
    cms_page_slug = 'contact'

    def get_language_code(self):
        return getattr(self.request, 'current_language_code', 'fr')

    def get_context_data(self, **kwargs):
        # Charger la page CMS
        self._cms_page = self.get_cms_page()
        context = super().get_context_data(**kwargs)
        language_code = self.get_language_code()

        # Ajouter la page CMS au contexte
        if self._cms_page:
            context['page'] = self._cms_page
            context['cms_page'] = self._cms_page

        # Informations de contact
        contact_infos = list(ContactInfo.objects.filter(is_active=True))
        prefetch_translations(contact_infos, language_code=language_code)
        context['contact_infos'] = contact_infos

        # Contacts par universite
        from apps.universities.models import University
        universities = list(University.objects.filter(
            is_active=True
        ).prefetch_related('contacts'))
        prefetch_translations(universities, language_code=language_code)
        context['universities'] = universities

        context['newsletter_form'] = NewsletterForm()

        return context

    def form_valid(self, form):
        # Sauvegarder le message
        message = form.save(commit=False)
        message.ip_address = self.get_client_ip()
        message.user_agent = self.request.META.get('HTTP_USER_AGENT', '')
        message.save()

        messages.success(self.request, 'Votre message a ete envoye avec succes. Nous vous repondrons dans les plus brefs delais.')
        return super().form_valid(form)

    def form_invalid(self, form):
        messages.error(self.request, 'Veuillez corriger les erreurs dans le formulaire.')
        return super().form_invalid(form)

    def get_client_ip(self):
        x_forwarded_for = self.request.META.get('HTTP_X_FORWARDED_FOR')
        if x_forwarded_for:
            ip = x_forwarded_for.split(',')[0]
        else:
            ip = self.request.META.get('REMOTE_ADDR')
        return ip


class ContactSuccessView(TemplateView):
    template_name = 'contact/success.html'


class NewsletterSubscribeView(FormView):
    form_class = NewsletterForm

    def form_valid(self, form):
        subscriber = form.save(commit=False)
        subscriber.ip_address = self.get_client_ip()
        # Generer des tokens pour verification/desinscription
        import secrets
        subscriber.verification_token = secrets.token_urlsafe(32)
        subscriber.unsubscribe_token = secrets.token_urlsafe(32)
        subscriber.save()

        if self.request.headers.get('X-Requested-With') == 'XMLHttpRequest':
            return JsonResponse({
                'success': True,
                'message': 'Merci pour votre inscription! Vous recevrez bientot nos actualites.'
            })

        messages.success(self.request, 'Merci pour votre inscription a la newsletter!')
        return super().form_valid(form)

    def form_invalid(self, form):
        if self.request.headers.get('X-Requested-With') == 'XMLHttpRequest':
            return JsonResponse({
                'success': False,
                'errors': form.errors
            }, status=400)

        messages.error(self.request, 'Erreur lors de l\'inscription.')
        return super().form_invalid(form)

    def get_success_url(self):
        return self.request.META.get('HTTP_REFERER', reverse_lazy('core:home'))

    def get_client_ip(self):
        x_forwarded_for = self.request.META.get('HTTP_X_FORWARDED_FOR')
        if x_forwarded_for:
            ip = x_forwarded_for.split(',')[0]
        else:
            ip = self.request.META.get('REMOTE_ADDR')
        return ip
