from django.db.models import Count
from django.urls import reverse
from django.views.generic import DetailView, ListView

from core.seo import breadcrumb_schema, project_schema
from profiles.models import Profile

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


class ExperienceListView(ListView):
    model = Experience
    template_name = "careers/experience_list.html"
    context_object_name = "experiences"

    def get_queryset(self):
        return Experience.objects.filter(is_published=True).prefetch_related("skills")

    def get_context_data(self, **kwargs):
        ctx = super().get_context_data(**kwargs)
        # Posisi di perusahaan yang sama digabung jadi satu kartu bertingkat.
        ctx["experience_groups"] = group_experiences(ctx["experiences"])
        ctx["educations"] = Education.objects.filter(is_published=True)
        ctx["certificates"] = Certificate.objects.filter(is_published=True)
        return ctx


class ProjectListView(ListView):
    model = Project
    template_name = "careers/project_list.html"
    context_object_name = "projects"
    paginate_by = 9

    def get_queryset(self):
        qs = Project.objects.filter(is_published=True).prefetch_related("tech_stack")
        tech = self.request.GET.get("tech")
        if tech:
            qs = qs.filter(tech_stack__id=tech)
        return qs.distinct()

    def get_context_data(self, **kwargs):
        ctx = super().get_context_data(**kwargs)
        ctx["techs"] = (
            Skill.objects.annotate(n=Count("projects")).filter(n__gt=0).order_by("-n", "name")
        )
        ctx["active_tech"] = self.request.GET.get("tech", "")
        return ctx


class ProjectDetailView(DetailView):
    model = Project
    template_name = "careers/project_detail.html"
    context_object_name = "project"

    def get_queryset(self):
        return Project.objects.filter(is_published=True).prefetch_related("tech_stack")

    def get_context_data(self, **kwargs):
        ctx = super().get_context_data(**kwargs)
        ctx["related"] = (
            Project.objects.filter(is_published=True)
            .exclude(pk=self.object.pk)
            .order_by("-is_featured", "-created_at")[:3]
        )
        ctx["schema_project"] = project_schema(self.request, self.object, Profile.get_solo())
        ctx["schema_breadcrumb"] = breadcrumb_schema(
            self.request,
            [
                ("Beranda", reverse("core:home")),
                ("Proyek", reverse("careers:project_list")),
                (self.object.title, self.object.get_absolute_url()),
            ],
        )
        return ctx
