from django.shortcuts import render, redirect, get_object_or_404
from django.contrib import messages
from django.http import JsonResponse
from django.views.decorators.http import require_POST
from django.views.decorators.csrf import csrf_exempt
from django.core.mail import send_mail
from django.conf import settings
from django.db.models import F
from .models import Lead
from .forms import InquiryForm, PropertyInquiryForm, ContactForm
from apps.properties.models import Property
from apps.analytics.utils import stitch_visitor


def _client_meta(request):
    ip = request.META.get('HTTP_X_FORWARDED_FOR', '').split(',')[0].strip() or request.META.get('REMOTE_ADDR', '')
    return {
        'ip_address': ip or None,
        'user_agent': request.META.get('HTTP_USER_AGENT', '')[:255],
        'referrer': request.META.get('HTTP_REFERER', '')[:500],
    }


def _notify_admin(lead):
    """Send email notification of new lead — fails silently in dev."""
    try:
        subject = f"New Lead: {lead.name} ({lead.get_source_display()})"
        body = (
            f"A new lead has been captured.\n\n"
            f"Name: {lead.name}\nEmail: {lead.email}\nPhone: {lead.phone}\n"
            f"Source: {lead.get_source_display()}\n"
            f"Property: {lead.property.title if lead.property else 'N/A'}\n"
            f"Interested in: {lead.interested_in}\n"
            f"Message: {lead.message}\n\n"
            f"View in admin: {settings.SITE_URL}/admin-panel/leads/"
        )
        send_mail(subject, body, settings.DEFAULT_FROM_EMAIL,
                  [settings.CONTACT_EMAIL], fail_silently=True)
    except Exception:
        pass


def inquiry(request):
    if request.method == 'POST':
        form = InquiryForm(request.POST)
        if form.is_valid():
            lead = form.save(commit=False)
            lead.source = 'inquiry_form'
            for k, v in _client_meta(request).items():
                setattr(lead, k, v)
            lead.save()
            stitch_visitor(request, lead)
            _notify_admin(lead)
            messages.success(request, "Thank you! We will contact you within 24 hours.")
            return redirect('leads:inquiry_thanks')
    else:
        form = InquiryForm()
    return render(request, 'leads/inquiry.html', {'form': form})


def inquiry_thanks(request):
    return render(request, 'leads/thanks.html')


@require_POST
def property_inquiry(request, slug):
    prop = get_object_or_404(Property, slug=slug, is_published=True)
    form = PropertyInquiryForm(request.POST)
    if form.is_valid():
        lead = form.save(commit=False)
        lead.property = prop
        lead.source = 'property_inquiry'
        for k, v in _client_meta(request).items():
            setattr(lead, k, v)
        lead.save()
        stitch_visitor(request, lead)
        Property.objects.filter(pk=prop.pk).update(inquiries_count=F('inquiries_count') + 1)
        _notify_admin(lead)
        if request.headers.get('x-requested-with') == 'XMLHttpRequest':
            return JsonResponse({'ok': True, 'message': 'Inquiry sent. We will contact you shortly.'})
        messages.success(request, "Inquiry sent! Our agent will contact you shortly.")
        return redirect('properties:detail', slug=prop.slug)
    if request.headers.get('x-requested-with') == 'XMLHttpRequest':
        return JsonResponse({'ok': False, 'errors': form.errors}, status=400)
    messages.error(request, "Please correct the errors below.")
    return redirect('properties:detail', slug=prop.slug)


def contact_submit(request):
    if request.method == 'POST':
        form = ContactForm(request.POST)
        if form.is_valid():
            lead = form.save(commit=False)
            lead.source = 'contact_form'
            for k, v in _client_meta(request).items():
                setattr(lead, k, v)
            lead.save()
            stitch_visitor(request, lead)
            _notify_admin(lead)
            messages.success(request, "Thank you for reaching out! We will respond shortly.")
            return redirect('core:contact')
        messages.error(request, "Please complete all required fields.")
    return redirect('core:contact')


@csrf_exempt
@require_POST
def popup_capture(request):
    """Exit-intent popup — minimal capture (email only)."""
    email = request.POST.get('email', '').strip()
    name = request.POST.get('name', '').strip() or 'Popup Lead'
    if not email:
        return JsonResponse({'ok': False, 'error': 'Email required'}, status=400)
    lead = Lead(name=name, email=email, source='exit_popup', **_client_meta(request))
    lead.save()
    stitch_visitor(request, lead)
    _notify_admin(lead)
    return JsonResponse({'ok': True, 'message': 'Subscribed! Watch your inbox for new deals.'})
