"""User get-or-create logic.

Single source of truth for user creation — both the user router
and face_service delegate here to prevent duplicate users.
"""

from sqlalchemy import select
from sqlalchemy.ext.asyncio import AsyncSession

from app.config import GLOBAL_USER_ID
from app.models.user import User


async def get_or_create_user(
    db: AsyncSession,
    name: str,
) -> tuple[User, bool]:
    """Find existing user by name or create a new one.

    Returns (user, created) where created=True if a new user was made.
    name="unknown" always resolves to the fixed-UUID global user — otherwise
    callers would silently spawn duplicate "unknown" users.
    """
    if name == "unknown":
        result = await db.execute(select(User).where(User.id == GLOBAL_USER_ID))
        return result.scalar_one(), False

    result = await db.execute(select(User).where(User.name == name))
    user = result.scalar_one_or_none()
    if user is not None:
        return user, False

    user = User(name=name)
    db.add(user)
    await db.flush()
    return user, True
