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 Project, ProjectCategory, Testimonial
from codesofy_lib.custom_config import get_global_master_details, set_menu_items, set_user_profile
from datetime import datetime

menu_item = "projects"

def get_local_master_details():
    return get_global_master_details()


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

class ProjectsListView(View):
    def get(self, request):
        context = get_local_master_details()
        projects = Project.objects.filter(status='published', display_on_website=True)
        
        search = request.GET.get('search', '')
        if search:
            projects = projects.filter(
                Q(title__icontains=search) |
                Q(description__icontains=search) |
                Q(client_name__icontains=search)
            )
        
        category_slug = request.GET.get('category')
        if category_slug:
            category = get_object_or_404(ProjectCategory, slug=category_slug)
            projects = projects.filter(category=category)
            context['current_category'] = category
        
        paginator = Paginator(projects, 9)
        page = request.GET.get('page', 1)
        projects = paginator.get_page(page)
        
        context['projects'] = projects
        context['categories'] = ProjectCategory.objects.all()
        context['search'] = search
        return render(request, 'projects_list.html', context)


class ProjectsDetailView(View):
    def get(self, request, slug):
        context = get_local_master_details()
        project = get_object_or_404(Project, slug=slug, status='published')
        context['project'] = project
        context['testimonials'] = project.testimonials.filter(display_on_website=True)
        context['categories'] = ProjectCategory.objects.all()
        return render(request, 'projects_detail.html', context)


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

@method_decorator(login_required, name='dispatch')
class ProjectAdminView(View):
    def get(self, request):
        context = get_local_master_details()
        context = set_menu_items(menu_item, 'projects_list', context)
        context['projects'] = Project.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, 'projects_admin_list.html', context)


@method_decorator(login_required, name='dispatch')
class ProjectCreateView(View):
    def get(self, request):
        context = get_local_master_details()
        context = set_menu_items(menu_item, 'projects_create', context)
        context['categories'] = ProjectCategory.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, 'projects_form.html', context)
    
    def post(self, request):
        title = request.POST.get('title')
        slug = request.POST.get('slug') or title.lower().replace(' ', '-')
        
        if Project.objects.filter(slug=slug).exists():
            messages.error(request, "A project with this slug already exists.")
            return redirect('projects_create')
        
        project = Project.objects.create(
            title=title,
            slug=slug,
            category_id=request.POST.get('category') or None,
            client_name=request.POST.get('client_name'),
            project_date=request.POST.get('project_date'),
            project_url=request.POST.get('project_url', ''),
            github_url=request.POST.get('github_url', ''),
            description=request.POST.get('description'),
            challenge=request.POST.get('challenge', ''),
            solution=request.POST.get('solution', ''),
            results=request.POST.get('results', ''),
            technologies=request.POST.get('technologies', ''),
            status=request.POST.get('status'),
            featured=request.POST.get('featured') == 'on',
            display_on_website=request.POST.get('display_on_website') == 'on',
            order=request.POST.get('order', 0),
            meta_title=request.POST.get('meta_title', ''),
            meta_description=request.POST.get('meta_description', ''),
            created_by=request.user,
            cover_image=request.FILES.get('cover_image'),
            image1=request.FILES.get('image1'),
            image2=request.FILES.get('image2'),
            image3=request.FILES.get('image3'),
        )
        
        messages.success(request, f"Project '{title}' created successfully!")
        return redirect('projects_admin')


@method_decorator(login_required, name='dispatch')
class ProjectEditView(View):
    def get(self, request, project_id):
        context = get_local_master_details()
        context = set_menu_items(menu_item, 'projects_edit', context)
        context['project'] = get_object_or_404(Project, id=project_id)
        context['categories'] = ProjectCategory.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, 'projects_form.html', context)
    
    def post(self, request, project_id):
        project = get_object_or_404(Project, id=project_id)
        slug = request.POST.get('slug') or request.POST.get('title').lower().replace(' ', '-')
        
        if Project.objects.filter(slug=slug).exclude(id=project_id).exists():
            messages.error(request, "A project with this slug already exists.")
            return redirect('projects_edit', project_id=project_id)
        
        project.title = request.POST.get('title')
        project.slug = slug
        project.category_id = request.POST.get('category') or None
        project.client_name = request.POST.get('client_name')
        project.project_date = request.POST.get('project_date')
        project.project_url = request.POST.get('project_url', '')
        project.github_url = request.POST.get('github_url', '')
        project.description = request.POST.get('description')
        project.challenge = request.POST.get('challenge', '')
        project.solution = request.POST.get('solution', '')
        project.results = request.POST.get('results', '')
        project.technologies = request.POST.get('technologies', '')
        project.status = request.POST.get('status')
        project.featured = request.POST.get('featured') == 'on'
        project.display_on_website = request.POST.get('display_on_website') == 'on'
        project.order = request.POST.get('order', 0)
        project.meta_title = request.POST.get('meta_title', '')
        project.meta_description = request.POST.get('meta_description', '')
        
        if request.FILES.get('cover_image'):
            project.cover_image = request.FILES.get('cover_image')
        if request.FILES.get('image1'):
            project.image1 = request.FILES.get('image1')
        if request.FILES.get('image2'):
            project.image2 = request.FILES.get('image2')
        if request.FILES.get('image3'):
            project.image3 = request.FILES.get('image3')
        
        project.save()
        
        messages.success(request, f"Project '{project.title}' updated successfully!")
        return redirect('projects_admin')


@method_decorator(login_required, name='dispatch')
class ProjectDeleteView(View):
    def post(self, request, project_id):
        project = get_object_or_404(Project, id=project_id)
        project.delete()
        messages.success(request, "Project deleted successfully!")
        return redirect('projects_admin')


@method_decorator(login_required, name='dispatch')
class ProjectCategoryAdminView(View):
    def get(self, request):
        context = get_local_master_details()
        context = set_menu_items(menu_item, 'categories', context)
        context['categories'] = ProjectCategory.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, 'projects_categories.html', context)
    
    def post(self, request):
        name = request.POST.get('name')
        slug = request.POST.get('slug') or name.lower().replace(' ', '-')
        
        if ProjectCategory.objects.filter(slug=slug).exists():
            messages.error(request, "Category with this slug already exists.")
            return redirect('projects_categories')
        
        ProjectCategory.objects.create(name=name, slug=slug)
        messages.success(request, f"Category '{name}' created successfully!")
        return redirect('projects_categories')


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


@method_decorator(login_required, name='dispatch')
class TestimonialAdminView(View):
    def get(self, request):
        context = get_local_master_details()
        context = set_menu_items(menu_item, 'testimonials', context)
        context['testimonials'] = Testimonial.objects.all().order_by('-created_at')
        context['projects'] = Project.objects.filter(status='published')
        
        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, 'projects_testimonials.html', context)
    
    def post(self, request):
        Testimonial.objects.create(
            project_id=request.POST.get('project'),
            client_name=request.POST.get('client_name'),
            client_designation=request.POST.get('client_designation', ''),
            client_company=request.POST.get('client_company', ''),
            content=request.POST.get('content'),
            rating=request.POST.get('rating', 5),
            display_on_website=request.POST.get('display_on_website') == 'on',
            client_image=request.FILES.get('client_image'),
        )
        
        messages.success(request, "Testimonial added successfully!")
        return redirect('projects_testimonials')


@method_decorator(login_required, name='dispatch')
class TestimonialDeleteView(View):
    def post(self, request, testimonial_id):
        testimonial = get_object_or_404(Testimonial, id=testimonial_id)
        testimonial.delete()
        messages.success(request, "Testimonial deleted successfully!")
        return redirect('projects_testimonials')