from django.db.models import Count
from rest_framework.response import Response
from rest_framework.views import APIView

from accounts.visibility import visible_companies, visible_seekers
from blog.models import BlogPost
from companies.utils import apply_open_jobs_count
from jobs.models import Job, JobCategory
from jobs.status import open_jobs_q
from podcast.models import PodcastEpisode
from subscriptions.carousel import carousel_companies_queryset, carousel_seekers_queryset
from testimonials.models import Testimonial

from .serializers import (
    BlogPostSerializer,
    CompanySerializer,
    JobListSerializer,
    PodcastEpisodeSerializer,
    SeekerProfileSerializer,
    TestimonialSerializer,
)


class HomeFeedView(APIView):
    """Aggregated homepage data - mirrors the web homepage sections."""

    def get(self, request):
        featured_companies = list(carousel_companies_queryset()[:8])
        featured_seekers = list(carousel_seekers_queryset()[:8])

        featured_blog = BlogPost.objects.filter(is_published=True, is_featured=True).first()
        featured_podcast = PodcastEpisode.objects.filter(is_published=True, is_featured=True).first()

        ctx = {'request': request}
        categories = (
            JobCategory.active()
            .annotate(job_count=Count('jobs', filter=open_jobs_q('jobs')))
            .filter(job_count__gt=0)
            .order_by('-job_count')[:6]
        )

        return Response({
            'stats': {
                'jobs': Job.objects.filter(is_active=True).count(),
                'companies': visible_companies().count(),
                'seekers': visible_seekers().count(),
            },
            'latest_jobs': JobListSerializer(
                Job.objects.filter(is_active=True).select_related('category')[:6],
                many=True,
                context=ctx,
            ).data,
            'job_categories': [
                {
                    'number': c.number,
                    'name': c.name,
                    'numbered_name': c.numbered_name,
                    'slug': c.slug,
                    'icon': c.icon,
                    'job_count': c.job_count,
                }
                for c in categories
            ],
            'featured_companies': CompanySerializer(
                apply_open_jobs_count(featured_companies),
                many=True,
                context=ctx,
            ).data,
            'featured_seekers': SeekerProfileSerializer(featured_seekers, many=True, context=ctx).data,
            'featured_blog': BlogPostSerializer(featured_blog, context=ctx).data if featured_blog else None,
            'latest_blog_posts': BlogPostSerializer(
                BlogPost.objects.filter(is_published=True).exclude(
                    pk=featured_blog.pk if featured_blog else None
                )[:4],
                many=True,
                context=ctx,
            ).data,
            'featured_podcast': PodcastEpisodeSerializer(featured_podcast, context=ctx).data if featured_podcast else None,
            'latest_podcast_episodes': PodcastEpisodeSerializer(
                PodcastEpisode.objects.filter(is_published=True).exclude(
                    pk=featured_podcast.pk if featured_podcast else None
                )[:4],
                many=True,
                context=ctx,
            ).data,
            'testimonials': TestimonialSerializer(
                Testimonial.objects.filter(is_approved=True)[:3],
                many=True,
                context=ctx,
            ).data,
        })
