"""Receivers for the SME-Hub linkage subprocess (SP3a).

Refreshes the AI matchmaking snapshot when an entrepreneur's matchmaking
inputs change — business verified, programme cohort joined, connection
accepted, etc. (FRSME-MPL005, FRSME-MPL006).
"""
from __future__ import annotations

from django.dispatch import receiver

from apps.smehub.incubation import signals as inc_signals
from apps.smehub.linkage import signals as linkage_signals
from apps.smehub.onboarding import signals as obr_signals


def _refresh_for_user(user, *, trigger: str) -> None:
    """Best-effort refresh: import lazily to avoid AppConfig import cycles."""
    if user is None:
        return
    try:
        from apps.smehub.linkage.ai_matchmaking import refresh_recommendations
        from apps.smehub.onboarding.models import EntrepreneurProfile
    except Exception:
        return
    profile = EntrepreneurProfile.objects.filter(user=user).first()
    if profile is None:
        return
    refresh_recommendations(profile, trigger=trigger)


@receiver(obr_signals.smehub_business_verified)
def _on_business_verified(sender, business, by_user=None, **kwargs):
    user = getattr(business.entrepreneur, "user", None)
    _refresh_for_user(user, trigger="business_verified")


@receiver(obr_signals.smehub_baseline_initialised)
def _on_baseline_initialised(sender, business, baseline, entrepreneur, **kwargs):
    _refresh_for_user(entrepreneur.user, trigger="baseline_initialised")


@receiver(inc_signals.smehub_cohort_confirmed)
def _on_cohort_confirmed(sender, cohort, members, **kwargs):
    for member in members:
        user = getattr(member.entrepreneur, "user", None)
        _refresh_for_user(user, trigger="cohort_confirmed")


@receiver(linkage_signals.smehub_connection_accepted)
def _on_connection_accepted(sender, connection_request, connection, by_user=None, **kwargs):
    user = getattr(connection_request.entrepreneur, "user", None)
    _refresh_for_user(user, trigger="connection_accepted")


@receiver(linkage_signals.smehub_recommendation_refresh_requested)
def _on_explicit_refresh(sender, entrepreneur, trigger="manual", **kwargs):
    _refresh_for_user(entrepreneur.user, trigger=trigger)
