"""Onboarding service functions for managing user onboarding flow."""

from __future__ import annotations

from django.contrib.auth.models import User

from accounts.models import MarketingProfile, OnboardingProgress


def get_or_create_onboarding(*, user: User) -> tuple[OnboardingProgress, MarketingProfile]:
    """
    Ensure user has both onboarding records.

    Returns:
        Tuple of (OnboardingProgress, MarketingProfile) instances.
    """
    progress, _ = OnboardingProgress.objects.get_or_create(user=user)
    profile, _ = MarketingProfile.objects.get_or_create(user=user)
    return progress, profile


def complete_welcome_step(*, user: User) -> OnboardingProgress:
    """
    Mark the welcome step as completed.

    Creates onboarding records if they don't exist.
    """
    progress, _ = get_or_create_onboarding(user=user)
    progress.completed_welcome = True
    progress.save(update_fields=["completed_welcome", "updated_at"])
    return progress


def update_onboarding_role(
    *,
    user: User,
    role: str | None,
    skip: bool,
) -> OnboardingProgress:
    """
    Update role selection and mark role step as completed.

    Args:
        user: The user to update.
        role: The role value to save (if not skipping).
        skip: If True, marks step complete without saving role.
    """
    progress, profile = get_or_create_onboarding(user=user)

    if not skip and role:
        profile.role = role
        profile.save(update_fields=["role", "updated_at"])

    progress.completed_role = True
    progress.save(update_fields=["completed_role", "updated_at"])
    return progress


def update_onboarding_company(
    *,
    user: User,
    company_size: str | None,
    skip: bool,
) -> OnboardingProgress:
    """
    Update company size selection and mark company step as completed.

    Args:
        user: The user to update.
        company_size: The company size value to save (if not skipping).
        skip: If True, marks step complete without saving company size.
    """
    progress, profile = get_or_create_onboarding(user=user)

    if not skip and company_size:
        profile.company_size = company_size
        profile.save(update_fields=["company_size", "updated_at"])

    progress.completed_company = True
    progress.save(update_fields=["completed_company", "updated_at"])
    return progress


def update_onboarding_channels(
    *,
    user: User,
    community_channels: list[str] | None,
    skip: bool,
) -> OnboardingProgress:
    """
    Update channel interests and complete onboarding (final step).

    Args:
        user: The user to update.
        community_channels: List of channel values to save (if not skipping).
        skip: If True, marks step complete without saving channels.

    Note:
        This is the final onboarding step, so it also sets
        has_completed_onboarding to True.
    """
    progress, profile = get_or_create_onboarding(user=user)

    if not skip and community_channels:
        profile.community_channels = community_channels
        profile.save(update_fields=["community_channels", "updated_at"])

    progress.completed_channels = True
    progress.has_completed_onboarding = True
    progress.save(
        update_fields=[
            "completed_channels",
            "has_completed_onboarding",
            "updated_at",
        ]
    )
    return progress


def skip_onboarding(*, user: User) -> OnboardingProgress:
    """
    Skip all remaining onboarding steps and mark as completed.

    Useful for users who want to get to the product quickly.
    """
    progress, _ = get_or_create_onboarding(user=user)
    progress.completed_welcome = True
    progress.completed_role = True
    progress.completed_company = True
    progress.completed_channels = True
    progress.has_completed_onboarding = True
    progress.save()
    return progress
