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


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


def get_by_session_id(db: Session, session_id: str) -> Optional[Calculationsession]:
    return db.query(Calculationsession).filter(Calculationsession.session_id == session_id).first()


def list_all(
    db: Session,
    limit: int = 20,
    offset: int = 0,
    **filters
) -> List[Calculationsession]:
    query = db.query(Calculationsession)
    
    if "session_id" in filters and filters["session_id"]:
        query = query.filter(Calculationsession.session_id.ilike(f"%{filters['session_id']}%"))
    
    return query.order_by(Calculationsession.last_activity_at.desc()).limit(limit).offset(offset).all()


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


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


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