"""Shared FastAPI dependencies."""
from __future__ import annotations

from fastapi import Depends, Request
from sqlalchemy import select
from sqlalchemy.orm import Session

from .auth import AuthenticatedUser, get_authenticated_user
from .db import get_db
from .errors import AppError, AUTH_USER_UNKNOWN
from .models.identity import GardenMember, User


def current_user(request: Request, db: Session = Depends(get_db)) -> User:
    """Resolve the Pattern B identity to a user row (auto-provisioned:
    id-auth owns authentication; the app just keys data by username)."""
    auth: AuthenticatedUser | None = get_authenticated_user(request)
    if auth is None:
        raise AppError(AUTH_USER_UNKNOWN, "no authenticated user", 401)
    user = db.scalar(select(User).where(User.external_username == auth.username))
    if user is None:
        from datetime import datetime, timezone

        user = User(
            external_username=auth.username,
            display_name=auth.username,
            created_at=datetime.now(timezone.utc),
        )
        db.add(user)
        db.flush()
    return user


def current_garden_id(
    user: User = Depends(current_user), db: Session = Depends(get_db)
) -> int:
    """The user's garden. Single-garden today (id=1); membership-resolved so
    multi-garden later is a query change, not an API change."""
    gid = db.scalar(
        select(GardenMember.garden_id)
        .where(GardenMember.user_id == user.id)
        .order_by(GardenMember.garden_id)
        .limit(1)
    )
    if gid is None:
        # First login of a user who isn't a member yet: join garden 1 as
        # member (owner seeding happened at migration).
        from datetime import datetime, timezone

        db.add(
            GardenMember(
                garden_id=1, user_id=user.id, role="member",
                created_at=datetime.now(timezone.utc),
            )
        )
        db.flush()
        gid = 1
    return gid
