
from sqlalchemy.orm import Session

from app.crud.base import CRUDBase
from app.models.knowledge_base import KnowledgeBase
from app.schemas.knowledge_base import KnowledgeBaseCreate, KnowledgeBaseUpdate
from common_logging import get_logger

logger = get_logger(__name__)


class CRUDKnowledgeBase(CRUDBase[KnowledgeBase, KnowledgeBaseCreate, KnowledgeBaseUpdate]):

    def get_by_name(
        self,
        db: Session,
        *,
        name: str,
        created_by: int | None = None,
        tenant_id: int | None = None,
    ) -> KnowledgeBase | None:
        query = db.query(KnowledgeBase).filter(KnowledgeBase.name == name)
        if created_by:
            query = query.filter(KnowledgeBase.created_by == created_by)
        if tenant_id is not None:
            query = query.filter(KnowledgeBase.tenant_id == tenant_id)
        return query.first()

    def remove(self, db: Session, *, id: int) -> KnowledgeBase | None:
        return self.delete(db, id=id)

    def get_by_code(
        self, db: Session, *, code: str, tenant_id: int | None = None
    ) -> KnowledgeBase | None:
        query = db.query(KnowledgeBase).filter(KnowledgeBase.code == code)
        if tenant_id is not None:
            query = query.filter(KnowledgeBase.tenant_id == tenant_id)
        return query.first()

    def get_by_type(
        self,
        db: Session,
        *,
        kb_type: str,
        tenant_id: int | None = None,
        skip: int = 0,
        limit: int = 100,
    ) -> list[KnowledgeBase]:
        query = db.query(KnowledgeBase).filter(KnowledgeBase.type == kb_type)
        if tenant_id is not None:
            query = query.filter(KnowledgeBase.tenant_id == tenant_id)
        return query.offset(skip).limit(limit).all()

    def get_by_status(
        self,
        db: Session,
        *,
        status: str,
        tenant_id: int | None = None,
        skip: int = 0,
        limit: int = 100,
    ) -> list[KnowledgeBase]:
        query = db.query(KnowledgeBase).filter(KnowledgeBase.status == status)
        if tenant_id is not None:
            query = query.filter(KnowledgeBase.tenant_id == tenant_id)
        return query.offset(skip).limit(limit).all()

    def search_by_name(
        self,
        db: Session,
        *,
        search_term: str,
        tenant_id: int | None = None,
        skip: int = 0,
        limit: int = 100,
    ) -> list[KnowledgeBase]:
        query = db.query(KnowledgeBase).filter(KnowledgeBase.name.like(f"%{search_term}%"))
        if tenant_id is not None:
            query = query.filter(KnowledgeBase.tenant_id == tenant_id)
        return query.offset(skip).limit(limit).all()

    def update_status(
        self,
        db: Session,
        *,
        kb_id: int,
        status: str,
        tenant_id: int | None = None,
        commit: bool = True,
    ) -> KnowledgeBase | None:
        query = db.query(KnowledgeBase).filter(KnowledgeBase.id == kb_id)
        if tenant_id is not None:
            query = query.filter(KnowledgeBase.tenant_id == tenant_id)
        kb = query.first()
        if not kb:
            return None
        kb.status = status
        db.add(kb)
        if commit:
            db.commit()
            db.refresh(kb)
            logger.bind(knowledge_base_id=kb.id).info("Knowledge base status updated")
        return kb


knowledge_base = CRUDKnowledgeBase(KnowledgeBase)
