
from sqlalchemy.orm import Session

from app.crud.base import CRUDBase
from app.models.menu import Menu
from app.schemas.menu import MenuCreate, MenuUpdate
from common_logging import get_logger

logger = get_logger(__name__)


class CRUDMenu(CRUDBase[Menu, MenuCreate, MenuUpdate]):

    def get_multi(self, db: Session, *, skip: int = 0, limit: int = 100, **kwargs) -> list[Menu]:
        query = db.query(self.model).filter(not self.model.is_deleted)
        return query.offset(skip).limit(limit).all()

    def get_by_code(self, db: Session, *, code: str) -> Menu | None:
        return db.query(Menu).filter(Menu.code == code, not Menu.is_deleted).first()

    def get_tree(self, db: Session, *, parent_id: int | None = None) -> list[Menu]:
        query = db.query(Menu).filter(not Menu.is_deleted, Menu.is_active)
        if parent_id is None:
            query = query.filter(Menu.parent_id.is_(None))
        else:
            query = query.filter(Menu.parent_id == parent_id)
        return query.order_by(Menu.sort_order.asc()).all()

    def get_all_active(self, db: Session) -> list[Menu]:
        return (
            db.query(Menu)
            .filter(not Menu.is_deleted, Menu.is_active)
            .order_by(Menu.sort_order.asc())
            .all()
        )


menu = CRUDMenu(Menu)
