from django.shortcuts import render, get_object_or_404, redirect
from django.core.paginator import Paginator
from django.db.models import Q, Count
from django.utils import timezone
from .models import News, Category, Tag, Advertisement, SiteSettings, Comment


def get_common_context():
    """Get common context data for all views"""
    settings = SiteSettings.load()
    categories = Category.objects.filter(is_active=True)
    breaking_news = News.objects.filter(
        status='published',
        is_breaking=True
    ).order_by('-published_at')[:3]
    
    # Trending news for sidebar (available on all pages)
    trending_news = News.objects.filter(
        status='published'
    ).order_by('-views_count', '-published_at')[:10]
    
    return {
        'site_settings': settings,
        'categories': categories,
        'breaking_news': breaking_news,
        'trending_news': trending_news,
    }


def home(request):
    """Homepage view"""
    context = get_common_context()
    
    # Featured news
    featured_news = News.objects.filter(
        status='published',
        is_featured=True
    ).order_by('-published_at')[:5]
    
    # Latest news
    latest_news = News.objects.filter(
        status='published'
    ).order_by('-published_at')[:12]
    
    # News by category in navbar order (Entertainment, Society, Culture, Politics, World, Sport)
    category_news = []
    category_slugs = ['entertainment', 'society', 'culture', 'politics', 'world', 'sport']
    
    for slug in category_slugs:
        try:
            category = Category.objects.get(slug=slug, is_active=True)
            news_list = category.news_articles.filter(
                status='published'
            ).order_by('-published_at')[:4]
            
            # Only add if there are news articles
            if news_list.exists():
                category_news.append({
                    'category': category,
                    'news': news_list
                })
        except Category.DoesNotExist:
            continue
    
    # Advertisements
    header_ads = Advertisement.objects.filter(
        position='header',
        is_active=True
    ).order_by('order')
    
    sidebar_ads = Advertisement.objects.filter(
        position='sidebar',
        is_active=True
    ).order_by('order')
    
    # Trending news (most viewed)
    trending_news = News.objects.filter(
        status='published'
    ).order_by('-views_count', '-published_at')[:10]
    
    context.update({
        'featured_news': featured_news,
        'latest_news': latest_news,
        'category_news': category_news,
        'header_ads': header_ads,
        'sidebar_ads': sidebar_ads,
        'trending_news': trending_news,
    })
    
    return render(request, 'news/home.html', context)


def news_detail(request, slug):
    """News detail view"""
    context = get_common_context()
    
    news = get_object_or_404(News, slug=slug, status='published')
    
    # Increment views count
    news.views_count += 1
    news.save(update_fields=['views_count'])
    
    # Get related news from same category
    related_news = News.objects.filter(
        category=news.category,
        status='published'
    ).exclude(id=news.id).order_by('-published_at')[:4]
    
    # Get approved comments
    comments = news.comments.filter(is_approved=True).order_by('-created_at')
    
    # Advertisements
    sidebar_ads = Advertisement.objects.filter(
        position='sidebar',
        is_active=True
    ).order_by('order')
    
    content_ads = Advertisement.objects.filter(
        position='between_content',
        is_active=True
    ).order_by('order')
    
    context.update({
        'news': news,
        'related_news': related_news,
        'comments': comments,
        'sidebar_ads': sidebar_ads,
        'content_ads': content_ads,
    })
    
    return render(request, 'news/detail.html', context)


def category_news(request, slug):
    """Category news listing view"""
    context = get_common_context()
    
    category = get_object_or_404(Category, slug=slug, is_active=True)
    
    news_list = News.objects.filter(
        category=category,
        status='published'
    ).order_by('-published_at')
    
    # Pagination
    paginator = Paginator(news_list, 12)
    page_number = request.GET.get('page')
    news = paginator.get_page(page_number)
    
    # Advertisements
    sidebar_ads = Advertisement.objects.filter(
        position='sidebar',
        is_active=True
    ).order_by('order')
    
    context.update({
        'category': category,
        'news': news,
        'sidebar_ads': sidebar_ads,
    })
    
    return render(request, 'news/category.html', context)


def tag_news(request, slug):
    """Tag news listing view"""
    context = get_common_context()
    
    tag = get_object_or_404(Tag, slug=slug)
    
    news_list = News.objects.filter(
        tags=tag,
        status='published'
    ).order_by('-published_at')
    
    # Pagination
    paginator = Paginator(news_list, 12)
    page_number = request.GET.get('page')
    news = paginator.get_page(page_number)
    
    # Advertisements
    sidebar_ads = Advertisement.objects.filter(
        position='sidebar',
        is_active=True
    ).order_by('order')
    
    context.update({
        'tag': tag,
        'news': news,
        'sidebar_ads': sidebar_ads,
    })
    
    return render(request, 'news/tag.html', context)


def search(request):
    """Search news view"""
    context = get_common_context()
    
    query = request.GET.get('q', '')
    
    if query:
        news_list = News.objects.filter(
            Q(title__icontains=query) |
            Q(summary__icontains=query) |
            Q(content__icontains=query),
            status='published'
        ).order_by('-published_at')
    else:
        news_list = News.objects.none()
    
    # Pagination
    paginator = Paginator(news_list, 12)
    page_number = request.GET.get('page')
    news = paginator.get_page(page_number)
    
    # Advertisements
    sidebar_ads = Advertisement.objects.filter(
        position='sidebar',
        is_active=True
    ).order_by('order')
    
    context.update({
        'query': query,
        'news': news,
        'sidebar_ads': sidebar_ads,
    })
    
    return render(request, 'news/search.html', context)


def submit_comment(request, news_id):
    """Submit comment on news article"""
    if request.method == 'POST':
        news = get_object_or_404(News, id=news_id, status='published')
        
        name = request.POST.get('name')
        email = request.POST.get('email')
        content = request.POST.get('content')
        
        if name and email and content:
            Comment.objects.create(
                news=news,
                name=name,
                email=email,
                content=content,
                is_approved=False  # Requires admin approval
            )
        
        return redirect('news_detail', slug=news.slug)
    
    return redirect('home')

