from sqlalchemy.orm import Session
from typing import Optional, List
from .models import User


def get_by_id(db: Session, entity_id: str) -> Optional[User]:
    return db.query(User).filter(User.id == entity_id).first()


def get_by_email(db: Session, email: str) -> Optional[User]:
    return db.query(User).filter(User.email == email).first()


def list_all(db: Session, limit: int = 20, offset: int = 0, role: Optional[str] = None, is_active: Optional[bool] = None) -> List[User]:
    query = db.query(User)
    
    if role is not None:
        query = query.filter(User.role == role)
    
    if is_active is not None:
        query = query.filter(User.is_active == is_active)
    
    return query.order_by(User.created_at.desc()).limit(limit).offset(offset).all()


def create(db: Session, data: dict) -> User:
    user = User(**data)
    db.add(user)
    db.flush()
    return user


def update(db: Session, entity_id: str, data: dict) -> Optional[User]:
    user = get_by_id(db, entity_id)
    if not user:
        return None
    
    for key, value in data.items():
        setattr(user, key, value)
    
    db.flush()
    return user


def delete(db: Session, entity_id: str) -> bool:
    user = get_by_id(db, entity_id)
    if not user:
        return False
    
    db.delete(user)
    db.flush()
    return True