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


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


def list_all(
    db: Session,
    limit: int = 20,
    offset: int = 0,
    user_id: Optional[str] = None,
    order_id: Optional[str] = None,
    transaction_type: Optional[str] = None,
    status: Optional[str] = None,
) -> List[Transaction]:
    query = db.query(Transaction)
    
    if user_id:
        query = query.filter(Transaction.user_id == user_id)
    if order_id:
        query = query.filter(Transaction.order_id == order_id)
    if transaction_type:
        query = query.filter(Transaction.transaction_type == transaction_type)
    if status:
        query = query.filter(Transaction.status == status)
    
    return query.order_by(Transaction.created_at.desc()).limit(limit).offset(offset).all()


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


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


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