from fastapi import APIRouter, Depends, Request
from sqlalchemy.orm import Session

from app.api.deps import get_current_user
from app.api.permissions import require_permission
from app.core.exceptions import QANotFoundError
from app.core.i18n import get_translator
from app.db.session import get_db
from app.models import KnowledgeQA, User
from app.schemas.knowledge_document import QACreate, QAResponse
from common_logging import get_logger

logger = get_logger(__name__)
router = APIRouter()


@router.get("/qa", response_model=list[QAResponse])
def get_qa_list(
    category_id: int | None = None, skip: int = 0, limit: int = 50, db: Session = Depends(get_db)
):
    query = db.query(KnowledgeQA).filter(KnowledgeQA.status == "active")
    if category_id:
        query = query.filter(KnowledgeQA.category_id == category_id)
    qa_list = query.order_by(KnowledgeQA.use_count.desc()).offset(skip).limit(limit).all()
    return qa_list


@router.post("/qa", response_model=QAResponse)
def create_qa(
    qa: QACreate,
    db: Session = Depends(get_db),
    current_user: User = Depends(get_current_user),
    _: None = Depends(require_permission("knowledge_bases", "create")),
):
    db_qa = KnowledgeQA(**qa.model_dump(), created_by=current_user.id)
    db.add(db_qa)
    db.commit()
    db.refresh(db_qa)
    return db_qa


@router.put("/qa/{qa_id}", response_model=QAResponse)
def update_qa(
    request: Request,
    qa_id: int,
    qa: QACreate,
    db: Session = Depends(get_db),
    current_user: User = Depends(get_current_user),
    _: None = Depends(require_permission("knowledge_bases", "update")),
):
    get_translator(request)
    db_qa = db.query(KnowledgeQA).filter(KnowledgeQA.id == qa_id).first()
    if not db_qa:
        raise QANotFoundError(qa_id)
    for key, value in qa.model_dump().items():
        setattr(db_qa, key, value)
    db.commit()
    db.refresh(db_qa)
    return db_qa


@router.delete("/qa/{qa_id}")
def delete_qa(
    request: Request,
    qa_id: int,
    db: Session = Depends(get_db),
    current_user: User = Depends(get_current_user),
    _: None = Depends(require_permission("knowledge_bases", "delete")),
):
    t = get_translator(request)
    db_qa = db.query(KnowledgeQA).filter(KnowledgeQA.id == qa_id).first()
    if not db_qa:
        raise QANotFoundError(qa_id)
    db.delete(db_qa)
    db.commit()
    return {"success": True, "message": t.t("knowledge.qa_deleted")}
