from django.shortcuts import render, get_object_or_404, redirect
from django.views import View
from django.contrib.auth.decorators import login_required
from django.utils.decorators import method_decorator
from django.contrib import messages
from django.core.paginator import Paginator
from django.db.models import Q
from .models import BlogPost, BlogCategory, BlogTag
from codesofy_lib.custom_config import get_global_master_details, set_menu_items, set_user_profile
from datetime import datetime

menu_item = "blog"

def get_local_master_details():
    return get_global_master_details()


# ==========================================
# PUBLIC VIEWS
# ==========================================

class BlogListView(View):
    def get(self, request):
        context = get_local_master_details()
        posts = BlogPost.objects.filter(status='published')
        
        # Search
        search = request.GET.get('search', '')
        if search:
            posts = posts.filter(
                Q(title__icontains=search) |
                Q(content__icontains=search) |
                Q(excerpt__icontains=search)
            )
        
        # Category filter
        category_slug = request.GET.get('category')
        if category_slug:
            category = get_object_or_404(BlogCategory, slug=category_slug)
            posts = posts.filter(category=category)
            context['current_category'] = category
        
        # Pagination
        paginator = Paginator(posts, 9)
        page = request.GET.get('page', 1)
        posts = paginator.get_page(page)
        
        context['posts'] = posts
        context['categories'] = BlogCategory.objects.all()
        context['tags'] = BlogTag.objects.all()
        context['search'] = search
        return render(request, 'blog_list.html', context)


class BlogDetailView(View):
    def get(self, request, slug):
        context = get_local_master_details()
        post = get_object_or_404(BlogPost, slug=slug, status='published')
        
        # Increment views
        post.views += 1
        post.save()
        
        # Related posts (same category)
        related_posts = BlogPost.objects.filter(
            category=post.category,
            status='published'
        ).exclude(id=post.id)[:3]
        
        context['post'] = post
        context['related_posts'] = related_posts
        context['categories'] = BlogCategory.objects.all()
        context['tags'] = BlogTag.objects.all()
        return render(request, 'blog_detail.html', context)


# ==========================================
# ADMIN VIEWS
# ==========================================

@method_decorator(login_required, name='dispatch')
class BlogAdminView(View):
    def get(self, request):
        context = get_local_master_details()
        context = set_menu_items(menu_item, 'blog_list', context)
        context['posts'] = BlogPost.objects.all().order_by('-created_at')
        
        user_profile = set_user_profile(request, context)
        context['logged_user_profile'] = user_profile
        context['dt_string'] = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
        
        return render(request, 'blog_list.html', context)


@method_decorator(login_required, name='dispatch')
class BlogCreateView(View):
    def get(self, request):
        context = get_local_master_details()
        context = set_menu_items(menu_item, 'blog_create', context)
        context['categories'] = BlogCategory.objects.all()
        context['tags'] = BlogTag.objects.all()
        
        user_profile = set_user_profile(request, context)
        context['logged_user_profile'] = user_profile
        context['dt_string'] = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
        
        return render(request, 'blog_form.html', context)
    
    def post(self, request):
        title = request.POST.get('title')
        slug = request.POST.get('slug') or title.lower().replace(' ', '-')
        
        if BlogPost.objects.filter(slug=slug).exists():
            messages.error(request, "A post with this slug already exists.")
            return redirect('blog_create')
        
        post = BlogPost.objects.create(
            title=title,
            slug=slug,
            category_id=request.POST.get('category') or None,
            author=request.user,
            content=request.POST.get('content'),
            excerpt=request.POST.get('excerpt', ''),
            featured_image=request.FILES.get('featured_image'),
            status=request.POST.get('status'),
            meta_title=request.POST.get('meta_title', ''),
            meta_description=request.POST.get('meta_description', ''),
        )
        
        # Add tags
        tag_ids = request.POST.getlist('tags')
        if tag_ids:
            post.tags.set(tag_ids)
        
        messages.success(request, f"Blog post '{title}' created successfully!")
        return redirect('blog_admin')


@method_decorator(login_required, name='dispatch')
class BlogEditView(View):
    def get(self, request, post_id):
        context = get_local_master_details()
        context = set_menu_items(menu_item, 'blog_edit', context)
        context['post'] = get_object_or_404(BlogPost, id=post_id)
        context['categories'] = BlogCategory.objects.all()
        context['tags'] = BlogTag.objects.all()
        
        user_profile = set_user_profile(request, context)
        context['logged_user_profile'] = user_profile
        context['dt_string'] = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
        
        return render(request, 'blog_form.html', context)
    
    def post(self, request, post_id):
        post = get_object_or_404(BlogPost, id=post_id)
        slug = request.POST.get('slug') or request.POST.get('title').lower().replace(' ', '-')
        
        if BlogPost.objects.filter(slug=slug).exclude(id=post_id).exists():
            messages.error(request, "A post with this slug already exists.")
            return redirect('blog_edit', post_id=post_id)
        
        post.title = request.POST.get('title')
        post.slug = slug
        post.category_id = request.POST.get('category') or None
        post.content = request.POST.get('content')
        post.excerpt = request.POST.get('excerpt', '')
        post.status = request.POST.get('status')
        post.meta_title = request.POST.get('meta_title', '')
        post.meta_description = request.POST.get('meta_description', '')
        
        if request.FILES.get('featured_image'):
            post.featured_image = request.FILES.get('featured_image')
        
        post.save()
        
        # Update tags
        tag_ids = request.POST.getlist('tags')
        post.tags.set(tag_ids)
        
        messages.success(request, f"Blog post '{post.title}' updated successfully!")
        return redirect('blog_admin')


@method_decorator(login_required, name='dispatch')
class BlogDeleteView(View):
    def post(self, request, post_id):
        post = get_object_or_404(BlogPost, id=post_id)
        post.delete()
        messages.success(request, "Blog post deleted successfully!")
        return redirect('blog_admin')


@method_decorator(login_required, name='dispatch')
class CategoryAdminView(View):
    def get(self, request):
        context = get_local_master_details()
        context = set_menu_items(menu_item, 'categories', context)
        context['categories'] = BlogCategory.objects.all().order_by('name')
        
        user_profile = set_user_profile(request, context)
        context['logged_user_profile'] = user_profile
        context['dt_string'] = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
        
        return render(request, 'blog_categories.html', context)
    
    def post(self, request):
        name = request.POST.get('name')
        slug = request.POST.get('slug') or name.lower().replace(' ', '-')
        
        if BlogCategory.objects.filter(slug=slug).exists():
            messages.error(request, "Category with this slug already exists.")
            return redirect('blog_categories')
        
        BlogCategory.objects.create(name=name, slug=slug)
        messages.success(request, f"Category '{name}' created successfully!")
        return redirect('blog_categories')


@method_decorator(login_required, name='dispatch')
class CategoryDeleteView(View):
    def post(self, request, category_id):
        category = get_object_or_404(BlogCategory, id=category_id)
        category.delete()
        messages.success(request, "Category deleted successfully!")
        return redirect('blog_categories')