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


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


def get_by_bus_number(db: Session, bus_number: str) -> Optional[Bus]:
    return db.query(Bus).filter(Bus.bus_number == bus_number).first()


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


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


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


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