from django.shortcuts import render, get_object_or_404, redirect
from django.db.models import Q
from .models import (
    SiteSettings, StaticPage,
    AboutPageContent, ContactPageContent, SubmitPageContent,
    TeamPageContent, EditorialBoardMember, Contributor,
)
from apps.articles.models import Article, Category

def home(request):
    settings = SiteSettings.get_solo()
    articles = Article.objects.filter(status='published').select_related('author').prefetch_related('categories', 'tags')
    
    # Grab featured article for hero section
    featured_article = articles.filter(is_featured=True).first()
    if not featured_article:
        featured_article = articles.first()
        
    # Grab editors picks for the 3 grid items
    editors_picks = articles.filter(is_editors_pick=True)[:3]
    if editors_picks.count() < 3:
        editors_picks = articles[:3]
        
    # Grab timeline events
    from apps.articles.models import TimelineEvent
    timeline_events = TimelineEvent.objects.select_related('article').order_by('order')[:6]
    
    from django.core.paginator import Paginator
    paginator = Paginator(articles, 12)
    page_number = request.GET.get('page')
    page_obj = paginator.get_page(page_number)
    
    from .models import HeroSlide, HomepageBlock
    from apps.store.models import StorePageContent
    context = {
        'hero_slides': [s.display() for s in HeroSlide.live()],
        'homepage_blocks': list(HomepageBlock.objects.filter(is_active=True).select_related('category')),
        'store_page': StorePageContent.get_solo(),
        'site': settings,
        'page_obj': page_obj,
        'featured_article': featured_article,
        'editors_picks': editors_picks,
        'timeline_events': timeline_events,
    }
    return render(request, 'articles/article_list.html', context)

def static_page(request, slug):
    page = get_object_or_404(StaticPage, slug=slug, is_published=True)
    return render(request, 'core/static_page.html', {'page': page})

def static_page_catchall(request, slug):
    """Catch-all: serves static pages at root-level URLs like /privacy-policy/"""
    page = get_object_or_404(StaticPage, slug=slug, is_published=True)
    return render(request, 'core/static_page.html', {'page': page})

def search(request):
    query = request.GET.get('q', '')
    results = []
    product_results = []
    if query:
        results = Article.objects.filter(
            Q(title__icontains=query) | Q(excerpt__icontains=query) | Q(body__icontains=query),
            status='published'
        ).distinct()
        from apps.store.models import Product
        product_results = Product.objects.filter(
            Q(title__icontains=query) | Q(description__icontains=query),
            is_active=True
        ).distinct()
    return render(request, 'core/search.html', {'query': query, 'results': results, 'products': product_results})

def about_us(request):
    """Dedicated About Us page — SEO powerhouse for The Reverse Times."""
    settings = SiteSettings.get_solo()
    page = AboutPageContent.get_solo()
    article_count = Article.objects.filter(status='published').count()
    category_count = Category.objects.filter(is_active=True).count()
    context = {
        'site': settings,
        'page': page,
        'article_count': article_count,
        'category_count': category_count,
    }
    return render(request, 'core/about.html', context)

def robots_txt(request):
    """Serve robots.txt dynamically."""
    from django.http import HttpResponse
    lines = [
        "User-agent: *",
        "Allow: /",
        "",
        "# Sitemaps",
        f"Sitemap: {request.scheme}://{request.get_host()}/sitemap.xml",
        "",
        "# Disallow admin and private paths",
        "Disallow: /admin/",
        "Disallow: /ckeditor/",
        "",
        "# The Reverse Times - Bangladesh's First Historical Magazine",
        "# History of Bangladesh, Naming History, Ancient Bengal, Cultural Heritage",
    ]
    return HttpResponse("\n".join(lines), content_type="text/plain")

def contact_us(request):
    """Contact Us page — handles form submission with optional attachment."""
    from .forms import ContactForm
    from .telegram import notify_contact_message
    
    settings = SiteSettings.get_solo()
    page = ContactPageContent.get_solo()
    if request.method == 'POST':
        form = ContactForm(request.POST, request.FILES)
        if form.is_valid():
            contact = form.save()
            # Send Telegram notification
            notify_contact_message(contact)
            return redirect('contact_success')
    else:
        form = ContactForm()
    return render(request, 'core/contact.html', {'form': form, 'site': settings, 'page': page})

def contact_success(request):
    """Thank-you page after successful contact form submission."""
    settings = SiteSettings.get_solo()
    return render(request, 'core/contact_success.html', {'site': settings})

def submit_article(request):
    """Submit Article page — handles form submission with required attachment."""
    from .forms import ContactForm
    from .telegram import notify_submission
    
    settings = SiteSettings.get_solo()
    page = SubmitPageContent.get_solo()
    
    if request.method == 'POST':
        # Force purpose to 'submission' for this view
        post_data = request.POST.copy()
        post_data['purpose'] = 'submission'
        
        form = ContactForm(post_data, request.FILES)
        if form.is_valid():
            contact = form.save()
            # Send Telegram notification specifically formatted for submissions
            notify_submission(contact)
            return redirect('contact_success')
    else:
        form = ContactForm(initial={'purpose': 'submission'})
        
    return render(request, 'core/submit.html', {'form': form, 'site': settings, 'page': page})

def team(request):
    """Our Contributors & Editorial Board page."""
    settings = SiteSettings.get_solo()
    page = TeamPageContent.get_solo()
    editorial_board = EditorialBoardMember.objects.filter(is_active=True)
    contributors = Contributor.objects.filter(is_active=True)
    context = {
        'site': settings,
        'page': page,
        'editorial_board': editorial_board,
        'contributors': contributors,
    }
    return render(request, 'core/team.html', context)

import json
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
from django.contrib.auth import login, logout
from django.contrib.auth.models import User
from django.shortcuts import redirect
from google.oauth2 import id_token
from google.auth.transport import requests

FIREBASE_PROJECT_ID = 'the-reverse-times-2026'

@csrf_exempt
def firebase_login(request):
    if request.method == 'POST':
        try:
            data = json.loads(request.body)
            token = data.get('idToken')
            
            # Verify the token using google-auth to bypass need for service account locally
            decoded_token = id_token.verify_firebase_token(token, requests.Request(), audience=FIREBASE_PROJECT_ID)
            uid = decoded_token['uid']
            email = decoded_token.get('email')
            name = decoded_token.get('name', 'User')

            # Create or get user
            user, created = User.objects.get_or_create(username=uid, defaults={'email': email, 'first_name': name})
            
            # Log the user in with explicit backend (required when bypassing authenticate())
            login(request, user, backend='django.contrib.auth.backends.ModelBackend')
            return JsonResponse({'status': 'success'})
        except Exception as e:
            return JsonResponse({'status': 'error', 'message': str(e)}, status=400)
    return JsonResponse({'status': 'invalid method'}, status=405)

def custom_logout(request):
    logout(request)
    return redirect('home')

