from django.shortcuts import render, redirect, get_object_or_404
from django.contrib import messages
from django.core.paginator import Paginator
from django.db import models

from .models import (
    Service, Skill, Project, Testimonial, About, SiteSettings,
    Pricing, BookingSession, BlogPost, BlogCategory, BlogComment
)
from .forms import ContactForm, BookingForm


def home(request):
    """Homepage with hero section"""
    try:
        about = About.objects.first()
    except:
        about = None
    
    services = Service.objects.filter(is_active=True)[:3]
    featured_projects = Project.objects.filter(is_featured=True)[:3]
    testimonials = Testimonial.objects.filter(is_active=True)[:3]
    
    context = {
        'about': about,
        'services': services,
        'featured_projects': featured_projects,
        'testimonials': testimonials,
    }
    return render(request, 'portfolio/home.html', context)


def about_view(request):
    """About page"""
    try:
        about = About.objects.first()
    except:
        about = None
    
    skills = Skill.objects.all()
    
    # Group skills by category
    frontend_skills = skills.filter(category='frontend')
    backend_skills = skills.filter(category='backend')
    tools_skills = skills.filter(category='tools')
    
    
    # blog_posts = BlogPost.objects.filter(is_published=True)[:3]
    context = {
        'about': about,
        'frontend_skills': frontend_skills,
        'backend_skills': backend_skills,
        'tools_skills': tools_skills,
        # 'blog_posts': blog_posts, 
    }
    return render(request, 'portfolio/about.html', context)


def services_view(request):
    """Services page"""
    services = Service.objects.filter(is_active=True)
    
    context = {
        'services': services,
    }
    return render(request, 'portfolio/services.html', context)


def pricing_view(request):
    """Pricing page"""
    pricing_plans = Pricing.objects.filter(is_active=True)
    
    context = {
        'pricing_plans': pricing_plans,
    }
    return render(request, 'portfolio/pricing.html', context)


def projects_view(request):
    """Projects portfolio page"""
    category = request.GET.get('category', 'all')
    
    if category == 'all':
        projects = Project.objects.all()
    else:
        projects = Project.objects.filter(category=category)
    
    categories = Project.objects.values_list('category', flat=True).distinct()
    
    context = {
        'projects': projects,
        'categories': categories,
        'active_category': category,
    }
    return render(request, 'portfolio/projects.html', context)


def project_detail(request, pk):
    """Single project detail"""
    project = get_object_or_404(Project, pk=pk)
    
    # Get related projects (same category, exclude current)
    related_projects = Project.objects.filter(
        category=project.category
    ).exclude(pk=pk)[:3]
    
    context = {
        'project': project,
        'related_projects': related_projects,
    }
    return render(request, 'portfolio/project_detail.html', context)


def contact_view(request):
    """Contact page with form"""
    if request.method == 'POST':
        form = ContactForm(request.POST)
        if form.is_valid():
            form.save()
            messages.success(request, '✅ Thank you! Your message has been sent successfully. I\'ll get back to you soon!')
            return redirect('portfolio:contact')
        else:
            messages.error(request, '⚠️ Please correct the errors below.')
    else:
        form = ContactForm()
    
    context = {
        'form': form,
    }
    return render(request, 'portfolio/contact.html', context)


def book_session_view(request):
    """Book a session page"""
    if request.method == 'POST':
        form = BookingForm(request.POST)
        if form.is_valid():
            form.save()
            messages.success(request, '✅ Booking request submitted! I\'ll contact you shortly to confirm your session.')
            return redirect('portfolio:book_session')
        else:
            messages.error(request, '⚠️ Please correct the errors below.')
    else:
        form = BookingForm()
    
    context = {
        'form': form,
    }
    return render(request, 'portfolio/book_session.html', context)


# Add these to your portfolio/views.py

# Update the home view in your views.py to include blog posts


def blog_list(request):
    """Blog listing page"""
    category_slug = request.GET.get('category')
    search_query = request.GET.get('q')
    
    posts = BlogPost.objects.filter(is_published=True)
    
    # Filter by category
    if category_slug:
        posts = posts.filter(category__slug=category_slug)
    
    # Search
    if search_query:
        posts = posts.filter(
            models.Q(title__icontains=search_query) |
            models.Q(content__icontains=search_query) |
            models.Q(excerpt__icontains=search_query)
        )
    
    # Pagination
    paginator = Paginator(posts, 9)  # 9 posts per page
    page_number = request.GET.get('page')
    page_obj = paginator.get_page(page_number)
    
    categories = BlogCategory.objects.all()
    featured_posts = BlogPost.objects.filter(is_published=True, is_featured=True)[:3]
    
    context = {
        'page_obj': page_obj,
        'categories': categories,
        'featured_posts': featured_posts,
        'active_category': category_slug,
        'search_query': search_query,
    }
    return render(request, 'portfolio/blog_list.html', context)


def blog_detail(request, slug):
    """Single blog post"""
    post = get_object_or_404(BlogPost, slug=slug, is_published=True)
    
    # Increment views
    post.increment_views()
    
    # Get related posts
    related_posts = BlogPost.objects.filter(
        is_published=True,
        category=post.category
    ).exclude(id=post.id)[:3]
    
    # Get approved comments
    comments = post.comments.filter(is_approved=True)
    
    # Handle comment submission
    if request.method == 'POST':
        name = request.POST.get('name')
        email = request.POST.get('email')
        comment = request.POST.get('comment')
        
        if name and email and comment:
            BlogComment.objects.create(
                post=post,
                name=name,
                email=email,
                comment=comment
            )
            messages.success(request, '✅ Thank you! Your comment is awaiting approval.')
            return redirect('portfolio:blog_detail', slug=slug)
    
    context = {
        'post': post,
        'related_posts': related_posts,
        'comments': comments,
    }
    return render(request, 'portfolio/blog_detail.html', context)


def blog_category(request, slug):
    """Blog posts by category"""
    category = get_object_or_404(BlogCategory, slug=slug)
    posts = BlogPost.objects.filter(is_published=True, category=category)
    
    # Pagination
    paginator = Paginator(posts, 9)
    page_number = request.GET.get('page')
    page_obj = paginator.get_page(page_number)
    
    context = {
        'category': category,
        'page_obj': page_obj,
    }
    return render(request, 'portfolio/blog_category.html', context)