"""
Centralized query filters for ResolutionFlow.

Provides reusable SQLAlchemy filter builders for tree access control
and step visibility, used across multiple endpoint modules.
"""
from __future__ import annotations
from typing import TYPE_CHECKING

from sqlalchemy import or_, and_, true as sa_true

if TYPE_CHECKING:
    from app.models.user import User


def build_tree_access_filter(current_user: User):
    """Build the access filter for trees based on user permissions.

    Visibility rules:
    - super_admin: sees everything
    - is_default: visible to all authenticated users
    - visibility='public': visible to all authenticated users
    - author_id == me: always visible (regardless of visibility setting)
    - visibility='team' AND account_id == mine: visible to account members
    - visibility='private': only visible to author (covered by author_id check above)
    - visibility='link': only visible to author (share token access is handled separately)
    """
    from app.models.tree import Tree

    if current_user.is_super_admin:
        return sa_true()

    conditions = [
        Tree.is_default == True,
        Tree.visibility == 'public',
        Tree.author_id == current_user.id,
    ]
    if current_user.account_id:
        conditions.append(
            and_(
                Tree.visibility == 'team',
                Tree.account_id == current_user.account_id
            )
        )
    return or_(*conditions)


def build_step_visibility_filter(current_user: User):
    """Build SQLAlchemy filter for step visibility based on user.

    Returns steps that are:
    - Public steps (visible to all)
    - Team steps (visible to same account members)
    - User's own private steps
    """
    from app.models.step_library import StepLibrary

    if current_user.account_id:
        return or_(
            StepLibrary.visibility == 'public',
            and_(StepLibrary.visibility == 'team', StepLibrary.account_id == current_user.account_id),
            StepLibrary.created_by == current_user.id  # Own private steps
        )
    else:
        return or_(
            StepLibrary.visibility == 'public',
            StepLibrary.created_by == current_user.id
        )
