"""Who can see full seeker profile details vs profession-only."""
from django.utils import timezone

from companies.models import Company
from subscriptions.usage import (
    can_company_download_cv,
    can_company_view_profile,
    get_company_benefits,
    profile_viewed_this_month,
    record_profile_view,
)

FULL = 'full'
PROFESSION_ONLY = 'profession_only'


def _get_company_for_user(user):
    if not user or not user.is_authenticated:
        return None
    return Company.objects.filter(owner=user, is_active=True).first()


def company_has_active_talent_subscription(company):
    """Company has a valid subscription that includes talent database profile views."""
    if not company:
        return False
    subscription = getattr(company, 'subscription', None)
    if not subscription or not subscription.is_valid:
        return False
    benefits = get_company_benefits(company)
    return benefits.cv_profile_views_per_month != 0 or benefits.cv_profile_views_per_month is None


def viewer_sees_full_seeker_listings(request):
    """Whether talent cards and carousel may show full candidate details."""
    user = request.user
    if not user.is_authenticated:
        return False
    if getattr(user, 'is_platform_admin', False):
        return True
    if getattr(user, 'is_seeker', False):
        return False
    if getattr(user, 'is_company', False):
        return company_has_active_talent_subscription(_get_company_for_user(user))
    return False


def resolve_seeker_profile_access(request, profile, *, record_view=True):
    """
    Resolve access for a profile page or CV endpoint.

    Returns dict with keys: level, message, can_view_cv, can_download_cv,
    can_message_seeker, show_contact.

    Set record_view=False when checking access without consuming a profile view
    (e.g. API list responses).
    """
    user = request.user
    result = {
        'level': PROFESSION_ONLY,
        'message': '',
        'can_view_cv': False,
        'can_download_cv': False,
        'can_message_seeker': False,
        'show_contact': False,
    }

    if user.is_authenticated and profile.user_id == user.id:
        result.update(
            level=FULL,
            can_view_cv=bool(profile.cv_file),
            can_download_cv=bool(profile.cv_file),
        )
        return result

    if user.is_authenticated and getattr(user, 'is_platform_admin', False):
        result.update(
            level=FULL,
            can_view_cv=bool(profile.cv_file),
            can_download_cv=bool(profile.cv_file),
            can_message_seeker=bool(profile.user_id),
            show_contact=True,
        )
        return result

    if user.is_authenticated and getattr(user, 'is_seeker', False):
        result['message'] = 'Full candidate details are available to subscribed employers only.'
        return result

    if user.is_authenticated and getattr(user, 'is_company', False):
        company = _get_company_for_user(user)
        if not company:
            result['message'] = 'Set up your company profile to view full candidate details.'
            return result
        if not company_has_active_talent_subscription(company):
            result['message'] = (
                'Subscribe to a recruitment plan to view full candidate profiles and CVs.'
            )
            return result

        if not profile_viewed_this_month(company, profile):
            allowed, message = can_company_view_profile(company, user)
            if not allowed:
                result['message'] = message
                return result
            if record_view:
                record_profile_view(company, profile, user)
                if profile.user_id:
                    from seekers.models import ProfileView

                    ProfileView.objects.create(
                        profile_user=profile.user,
                        viewer=user,
                        account_type='company',
                        viewed_at=timezone.now(),
                    )

        can_download, _message = can_company_download_cv(company, user)
        cv_open = bool(profile.cv_file) and profile.allow_cv_access
        result.update(
            level=FULL,
            can_view_cv=cv_open,
            can_download_cv=can_download and cv_open,
            can_message_seeker=bool(profile.user_id),
            show_contact=profile.contact_employers,
        )
        return result

    result['message'] = (
        'Sign in as an employer with an active subscription to view full profiles.'
    )
    return result
