"""Cross-app SME-Hub admin shell views (Slice B.2).

Each admin shell is a thin TemplateView that aggregates KPI counts and
links to existing per-area admin queues / dashboards. No new business
logic — these pages are pure orchestration so admins can land on a
single page and dispatch.
"""
from __future__ import annotations

from django.contrib.auth.mixins import LoginRequiredMixin
from django.views.generic import TemplateView

from apps.smehub._shared.role_gates import SMEAdminRequired
from apps.smehub.incubation.models import Application, Programme
from apps.smehub.investment.models import (
    FundingApplication,
    FundingCall,
    Investor,
    ManualFundingRecord,
)
from apps.smehub.linkage.models import (
    ConnectionRequest,
    MoU,
    PartnerDirectoryEntry,
    ServiceProviderEntry,
)
from apps.smehub.marketplace.models import (
    BuyerRegistryEntry,
    DemandResponse,
    MarketDemandListing,
)
from apps.smehub.onboarding.models import (
    Business,
    EntrepreneurProfile,
    Innovation,
)
from apps.smehub.showcasing.models import (
    DealRoom,
    InnovationChallenge,
    ShowcaseEvent,
)


class AdminVerificationHubView(SMEAdminRequired, LoginRequiredMixin, TemplateView):
    """One page for all verification queues across the SME-Hub."""

    template_name = "smehub/admin_verification.html"

    def get_context_data(self, **kwargs):
        ctx = super().get_context_data(**kwargs)
        ctx["counts"] = {
            "entrepreneurs_pending": EntrepreneurProfile.objects.filter(
                verification_status__in=[
                    EntrepreneurProfile.Status.PENDING_VERIFICATION,
                    EntrepreneurProfile.Status.PENDING_MORE_INFO,
                ],
            ).count(),
            "businesses_pending": Business.objects.filter(
                verification_status=Business.Status.PENDING_ADMIN_REVIEW,
            ).count(),
            "innovations_pending": Innovation.objects.filter(
                lifecycle_status__in=[Innovation.Status.SUBMITTED, Innovation.Status.UNDER_VETTING],
            ).count(),
            "partners_pending": PartnerDirectoryEntry.objects.filter(
                verification_status=PartnerDirectoryEntry.Status.PENDING,
            ).count(),
            "providers_pending": ServiceProviderEntry.objects.filter(
                verification_status=ServiceProviderEntry.Status.PENDING,
            ).count(),
            "buyers_pending": BuyerRegistryEntry.objects.filter(
                verification_status=BuyerRegistryEntry.Status.PENDING,
            ).count(),
            "investors_pending": Investor.objects.filter(
                verification_status=Investor.Status.PENDING,
            ).count(),
        }
        return ctx


class AdminPipelineHubView(SMEAdminRequired, LoginRequiredMixin, TemplateView):
    """One page for showcasing + investment + deal-room operations."""

    template_name = "smehub/admin_pipeline.html"

    def get_context_data(self, **kwargs):
        ctx = super().get_context_data(**kwargs)
        ctx["counts"] = {
            "live_events": ShowcaseEvent.objects.filter(
                status__in=[
                    ShowcaseEvent.Status.PUBLISHED,
                    ShowcaseEvent.Status.LIVE,
                ],
            ).count(),
            "open_challenges": InnovationChallenge.objects.filter(
                status=InnovationChallenge.Status.OPEN,
            ).count(),
            "open_deal_rooms": DealRoom.objects.filter(status=DealRoom.Status.OPEN).count(),
            "published_calls": FundingCall.objects.filter(
                status=FundingCall.Status.PUBLISHED,
            ).count(),
            "submitted_apps": FundingApplication.objects.filter(
                status=FundingApplication.Status.SUBMITTED,
            ).count(),
            "manual_records": ManualFundingRecord.objects.count(),
        }
        return ctx


class AdminOperationsHubView(SMEAdminRequired, LoginRequiredMixin, TemplateView):
    """One page for programme management, cohorts, linkage operations,
    regulatory authoring, backend register."""

    template_name = "smehub/admin_operations.html"

    def get_context_data(self, **kwargs):
        from apps.smehub.incubation.models import CohortMember

        ctx = super().get_context_data(**kwargs)
        ctx["counts"] = {
            "draft_programmes": Programme.objects.filter(
                status=Programme.Status.DRAFT,
            ).count(),
            "published_programmes": Programme.objects.filter(
                status=Programme.Status.PUBLISHED,
            ).count(),
            "open_applications": Application.objects.filter(
                status__in=[
                    Application.Status.SUBMITTED,
                    Application.Status.UNDER_REVIEW,
                ],
            ).count(),
            "pending_mou_review": MoU.objects.filter(status=MoU.Status.UNDER_REVIEW).count(),
            "open_connections": ConnectionRequest.objects.filter(
                status=ConnectionRequest.Status.PENDING,
            ).count(),
            "open_demand": MarketDemandListing.objects.filter(
                status=MarketDemandListing.Status.OPEN,
            ).count(),
            "awarded_responses": DemandResponse.objects.filter(
                status=DemandResponse.Status.AWARDED,
            ).count(),
            # FRSME-INC025 — surface silently-absorbed REP enrolment failures.
            "failed_enrolments": CohortMember.objects.exclude(last_enrol_error="").count(),
        }
        return ctx
