from dash_app.models import Blog
from django.shortcuts import render, get_object_or_404
from dash_app.models import Module, Page, ContactEnquiry, ServiceEnquiry
from django.urls import reverse
from django.shortcuts import redirect as _redirect
from django.contrib import messages
from django.core.mail import EmailMultiAlternatives
from django.template.loader import render_to_string
from django.utils.html import strip_tags
from django.conf import settings
from django.contrib.auth.models import User
import urllib.request
import urllib.parse
import json
from django.contrib import messages
from django.shortcuts import redirect


def _get_page_context(title, description, keywords):
    """Return a page meta-data dict matching the {{ page.xxx }} pattern in templates."""
    return {
        'page': {
            'meta_title': title,
            'meta_description': description,
            'meta_keywords': keywords,
        }
    }


def index(request):
    """Home page — no login required."""
    ctx = _get_page_context(
        title='Safeway Auto Solutions - Doorstep Vehicle Pickup & Repair Qatar',
        description='Safeway picks up, repairs, and delivers your vehicle with ease. '
                    'Trusted auto solutions in Qatar with 24/7 emergency support.',
        keywords='safeway auto, vehicle repair Qatar, doorstep car service, breakdown Qatar, fleet management',
    )
    ctx['active_nav'] = 'home'
    ctx['featured_posts'] = Blog.objects.filter(is_featured=True, status='Published')
    ctx['posts'] = Blog.objects.filter(status='Published').order_by('-created_at')
    
    return render(request, 'frontend/index.html', ctx)


def about(request):
    about_info = Page.objects.filter(title__icontains='about').first()
    ctx = _get_page_context(
        title='About Us - Safeway Auto Solutions',
        description='Learn about Safeway Auto Solutions — Qatar\'s trusted vehicle service partner '
                    'offering pickup, repair, maintenance and fleet support.',
        keywords='about safeway, auto solutions Qatar, vehicle service partner, car repair Qatar',
    )
    ctx['active_nav'] = 'about'
    ctx['about_info'] = about_info
    return render(request, 'frontend/about.html', ctx)


def service(request):
    ctx = _get_page_context(
        title='Services - Safeway Auto Solutions',
        description='Professional auto services in Qatar - breakdown assistance, maintenance, '
                    'repairs, and free pickup & delivery.',
        keywords='car services Qatar, breakdown assistance, periodic maintenance, brake works, '
                 'battery, AC service, tire alignment',
    )
    ctx['active_nav'] = 'service'
    return render(request, 'frontend/service.html', ctx)


def blog(request):
    ctx = _get_page_context(
        title='Blog - Safeway Auto Solutions',
        description='Read Safeway\'s vehicle maintenance articles and customer education blog — '
                    'tips for Qatar drivers.',
        keywords='safeway blog, car maintenance tips Qatar, vehicle care articles',
    )
    ctx['active_nav'] = 'blog'
    ctx['featured_posts'] = Blog.objects.filter(is_featured=True, status='Published')
    ctx['posts'] = Blog.objects.filter(status='Published', is_featured=False).order_by('-created_at')
    return render(request, 'frontend/blog.html', ctx)


def blog_detail(request, slug):
    post = get_object_or_404(Blog, slug=slug, status='Published')
    ctx = _get_page_context(
        title=f"{post.title} - Safeway Auto Solutions",
        description=post.short_description,
        keywords=post.meta_tags if post.meta_tags else 'car care Qatar, summer driving tips, safeway blog, vehicle maintenance',
    )
    ctx['active_nav'] = 'blog'
    ctx['post'] = post
    ctx['prev_post'] = Blog.objects.filter(status='Published', created_at__lt=post.created_at).order_by('-created_at').first()
    ctx['next_post'] = Blog.objects.filter(status='Published', created_at__gt=post.created_at).order_by('created_at').first()
    
    if post.meta_tags:
        ctx['tags'] = [tag.strip() for tag in post.meta_tags.split(',') if tag.strip()]
    else:
        ctx['tags'] = []
        
    return render(request, 'frontend/blog-detail.html', ctx)


def contact(request):
    contact_info = Page.objects.filter(title__icontains='contact').first()
    ctx = _get_page_context(
        title='Contact Us - Safeway Auto Solutions',
        description='Contact Safeway Auto Solutions in Qatar. Call +974 6000 2324 or visit '
                    'our branches in Industrial Area, Doha.',
        keywords='contact safeway, auto repair Qatar, call safeway, location Qatar garage',
    )
    ctx['active_nav'] = 'contact'
    ctx['contact_info'] = contact_info
    return render(request, 'frontend/contact.html', ctx)


def page_detail(request, slug):
    """
    If the slug matches a known built-in page, redirect there.
    Otherwise render a custom CMS page from the dashboard.
    """
    SLUG_TO_URL = {
        'index':    'frontend_app:index',   # Home page
        'home':     'frontend_app:index',
        'about':    'frontend_app:about',
        'services': 'frontend_app:service',
        'service':  'frontend_app:service',
        'blog':     'frontend_app:blog',
        'contact':  'frontend_app:contact',
    }
    

    if slug in SLUG_TO_URL:
        return _redirect(reverse(SLUG_TO_URL[slug]))

    # Custom CMS page from dashboard
    cms_page = get_object_or_404(Page, slug=slug, show_in_menu=True)
    ctx = _get_page_context(
        title=cms_page.meta_title or cms_page.title,
        description=cms_page.meta_description or '',
        keywords=cms_page.meta_keywords or '',
    )
    ctx['active_nav'] = slug
    ctx['cms_page'] = cms_page
    return render(request, 'frontend/page_detail.html', ctx)

    


def submit_contact(request):
    if request.method == 'POST':
        recaptcha_response = request.POST.get('g-recaptcha-response')
        url = 'https://www.google.com/recaptcha/api/siteverify'
        values = {
            'secret': '6Lc3uiktAAAAACyTzWqxJd5H00mHCxZI32EKQBdm',
            'response': recaptcha_response
        }
        data = urllib.parse.urlencode(values).encode()
        req =  urllib.request.Request(url, data=data)
        response = urllib.request.urlopen(req)
        result = json.loads(response.read().decode())
        
        if not result.get('success') or result.get('score', 0) < 0.5:
            messages.error(request, "Spam detected by reCAPTCHA. Please try again.")
            return redirect(request.META.get('HTTP_REFERER', '/'))
        
        name = request.POST.get('your-name') or request.POST.get('name')
        phone = request.POST.get('phone')
        email = request.POST.get('email')
        subject = request.POST.get('subject')
        message = request.POST.get('message')
        
        enquiry = ContactEnquiry.objects.create(
            name=name,
            phone=phone,
            email=email,
            subject=subject,
            message=message
        )
        
        # Send Email Notification to Admin
        try:
            admin_user = User.objects.filter(is_superuser=True).first()
            admin_email = admin_user.email if admin_user and admin_user.email else settings.DEFAULT_FROM_EMAIL
            
            html_content = render_to_string('emails/contact_request.html', {'enquiry': enquiry})
            text_content = strip_tags(html_content)
            
            msg = EmailMultiAlternatives(
                subject=f"New Contact Request: {subject}",
                body=text_content,
                from_email=settings.DEFAULT_FROM_EMAIL,
                to=[admin_email],
                reply_to=[email] if email else None
            )
            msg.attach_alternative(html_content, "text/html")
            msg.send(fail_silently=True)
        except Exception as e:
            print(f"Email sending failed: {e}")
        messages.success(request, 'Thank you! Your message has been sent successfully. We will contact you soon.')
        
        referer = request.META.get('HTTP_REFERER')
        if referer:
            return _redirect(referer)
        return _redirect('/#contactid')
    return _redirect('frontend_app:index')

def submit_service(request):
    if request.method == 'POST':
        recaptcha_response = request.POST.get('g-recaptcha-response')
        url = 'https://www.google.com/recaptcha/api/siteverify'
        values = {
            'secret': '6Lc3uiktAAAAACyTzWqxJd5H00mHCxZI32EKQBdm',
            'response': recaptcha_response
        }
        data = urllib.parse.urlencode(values).encode()
        req =  urllib.request.Request(url, data=data)
        response = urllib.request.urlopen(req)
        result = json.loads(response.read().decode())
        
        if not result.get('success') or result.get('score', 0) < 0.5:
            messages.error(request, "Spam detected by reCAPTCHA. Please try again.")
            return redirect(request.META.get('HTTP_REFERER', '/'))
        
        fullname = request.POST.get('fullname')
        email = request.POST.get('email')
        phone = request.POST.get('phone')
        preferred_date = request.POST.get('date')
        service_type = request.POST.get('service')
        pickup_address = request.POST.get('pickup_address')
        vehicle_make = request.POST.get('vehicle_make')
        vehicle_model = request.POST.get('vehicle_model')
        issue_description = request.POST.get('issue_description')
        landmarks = request.POST.get('landmarks')
        
        try:
            enquiry = ServiceEnquiry.objects.create(
                fullname=fullname,
                email=email,
                phone=phone,
                preferred_date=preferred_date,
                service_type=service_type,
                pickup_address=pickup_address,
                vehicle_make=vehicle_make,
                vehicle_model=vehicle_model,
                issue_description=issue_description,
                landmarks=landmarks
            )
            
            # Send Email Notification to Admin
            try:
                admin_user = User.objects.filter(is_superuser=True).first()
                admin_email = admin_user.email if admin_user and admin_user.email else settings.DEFAULT_FROM_EMAIL
                
                html_content = render_to_string('emails/service_request.html', {'enquiry': enquiry})
                text_content = strip_tags(html_content)
                
                msg = EmailMultiAlternatives(
                    subject=f"New Service Request from {fullname}",
                    body=text_content,
                    from_email=settings.DEFAULT_FROM_EMAIL,
                    to=[admin_email],
                    reply_to=[email] if email else None
                )
                msg.attach_alternative(html_content, "text/html")
                msg.send(fail_silently=True)
            except Exception as e:
                print(f"Email sending failed: {e}")
            messages.success(request, f'Thank you {fullname}! Your service request for "{service_type}" has been received. Our team will contact you within 1 hour on your provided number.')
        except Exception as e:
            messages.error(request, f'Error submitting service request: {str(e)}')
            print(f"Service submission error: {e}")
        
        referer = request.META.get('HTTP_REFERER')
        if referer:
            return _redirect(referer)
        return _redirect('frontend_app:service')
    return _redirect('frontend_app:index')