from django.contrib import messages
from django.db.models import Q
from django.shortcuts import render
from django.urls import reverse, reverse_lazy
from django.views.generic import TemplateView
from django.views.generic.edit import FormView

from blog.models import Post
from careers.grouping import group_experiences
from careers.models import Certificate, Education, Experience, Project, Skill

from .forms import ContactForm


class HomeView(TemplateView):
    template_name = "core/home.html"

    def get_context_data(self, **kwargs):
        ctx = super().get_context_data(**kwargs)
        # Ambil agak banyak dulu, kelompokkan per perusahaan, baru dipotong —
        # supaya beberapa posisi di satu perusahaan tidak memakan jatah slot.
        semua = Experience.objects.filter(is_published=True).prefetch_related("skills")[:10]
        ctx.update(
            {
                "experience_groups": group_experiences(semua)[:3],
                "projects": Project.objects.filter(is_published=True, is_featured=True)
                .prefetch_related("tech_stack")[:6],
                "skills": Skill.objects.filter(is_featured=True)[:12],
                "posts": Post.published.select_related("category")[:3],
                "stat_experience": Experience.objects.filter(is_published=True).count(),
                "stat_project": Project.objects.filter(is_published=True).count(),
                "stat_certificate": Certificate.objects.filter(is_published=True).count(),
                "stat_post": Post.published.count(),
            }
        )
        return ctx


class AboutView(TemplateView):
    template_name = "core/about.html"

    def get_context_data(self, **kwargs):
        ctx = super().get_context_data(**kwargs)
        skills = Skill.objects.all()
        grouped = {}
        for skill in skills:
            grouped.setdefault(skill.get_category_display(), []).append(skill)
        ctx["skill_groups"] = grouped
        ctx["educations"] = Education.objects.filter(is_published=True)
        ctx["certificates"] = Certificate.objects.filter(is_published=True)[:6]
        return ctx


class ContactView(FormView):
    template_name = "core/contact.html"
    form_class = ContactForm
    success_url = reverse_lazy("core:contact")

    def form_valid(self, form):
        form.save()
        messages.success(self.request, "Pesan kamu sudah terkirim. Terima kasih!")
        return super().form_valid(form)

    def form_invalid(self, form):
        messages.error(self.request, "Ada isian yang belum benar. Cek lagi ya.")
        return super().form_invalid(form)


def search_view(request):
    query = request.GET.get("q", "").strip()
    posts, projects = [], []
    if query:
        posts = Post.published.filter(
            Q(title__icontains=query) | Q(excerpt__icontains=query) | Q(content__icontains=query)
        )[:20]
        projects = Project.objects.filter(is_published=True).filter(
            Q(title__icontains=query) | Q(short_description__icontains=query)
        )[:20]
    return render(
        request,
        "core/search.html",
        {"query": query, "posts": posts, "projects": projects, "total": len(posts) + len(projects)},
    )


def robots_txt(request):
    """Berkas pertama yang dibaca mesin pencari saat mengunjungi domain."""
    return render(
        request,
        "robots.txt",
        {"sitemap_url": request.build_absolute_uri(reverse("sitemap"))},
        content_type="text/plain",
    )


def handler404(request, exception):
    return render(request, "core/404.html", status=404)


def handler500(request):
    return render(request, "core/500.html", status=500)
