"""Job recommendations based on seeker profile category and skills."""
from .matching import compute_seeker_job_match
from .models import Job
from .querysets import with_job_logo
from .status import annotate_open_first, open_jobs_q


def _open_jobs():
    return with_job_logo(
        annotate_open_first(Job.objects.filter(open_jobs_q()).select_related('category'))
    )


def recommended_jobs_for_profile(profile, *, limit=8, exclude_ids=None):
    """
    Recommend open jobs for a seeker profile.

    Prioritises the profile's job category (e.g. HR roles with varied titles),
    then fills with skill-matched roles from other categories.
    """
    if not profile:
        return _open_jobs().order_by('_open_sort', '-is_featured', '-created_at')[:limit]

    exclude_ids = exclude_ids or []
    results = []
    seen = set(exclude_ids)

    if profile.job_category_id:
        category_jobs = (
            _open_jobs()
            .filter(category=profile.job_category)
            .exclude(pk__in=seen)
            .order_by('_open_sort', '-is_featured', '-created_at')
        )
        for job in category_jobs[:limit]:
            results.append(job)
            seen.add(job.pk)

    if len(results) < limit and (profile.skill_list or profile.headline):
        candidates = (
            _open_jobs()
            .exclude(pk__in=seen)
            .order_by('_open_sort', '-created_at')[:50]
        )
        scored = sorted(
            ((compute_seeker_job_match(profile, job), job) for job in candidates),
            key=lambda item: item[0],
            reverse=True,
        )
        for _score, job in scored:
            if len(results) >= limit:
                break
            if job.pk not in seen:
                results.append(job)
                seen.add(job.pk)

    if len(results) < limit:
        for job in _open_jobs().exclude(pk__in=seen).order_by('_open_sort', '-is_featured', '-created_at'):
            results.append(job)
            seen.add(job.pk)
            if len(results) >= limit:
                break

    return results[:limit]


def category_browse_url(category_slug):
    from django.urls import reverse

    if not category_slug:
        return reverse('jobs:list')
    return f"{reverse('jobs:list')}?category={category_slug}"
