from fastapi import APIRouter, HTTPException
from pydantic import BaseModel, Field

from app.services.kb_service import KBService

router = APIRouter()
kb = KBService()


class CategoryCreate(BaseModel):
    code: str = Field(..., min_length=1)
    title: str = Field(..., min_length=1)


class CategoryUpdate(BaseModel):
    title: str = Field(..., min_length=1)


class IssueCreate(BaseModel):
    code: str = Field(..., min_length=1)
    title: str = Field(..., min_length=1)
    steps: list[str]


class IssueUpdate(BaseModel):
    title: str = Field(..., min_length=1)
    steps: list[str]


@router.get("/admin/data")
def admin_data():
    kb.reload()
    return kb.data


@router.post("/admin/categories")
def create_category(payload: CategoryCreate):
    try:
        return kb.add_category(payload.code, payload.title)
    except ValueError as e:
        raise HTTPException(status_code=400, detail=str(e))


@router.put("/admin/categories/{category_code}")
def update_category(category_code: str, payload: CategoryUpdate):
    try:
        return kb.update_category(category_code, payload.title)
    except ValueError as e:
        raise HTTPException(status_code=404, detail=str(e))


@router.delete("/admin/categories/{category_code}")
def delete_category(category_code: str):
    try:
        kb.delete_category(category_code)
        return {"status": "success"}
    except ValueError as e:
        raise HTTPException(status_code=404, detail=str(e))


@router.post("/admin/categories/{category_code}/issues")
def create_issue(category_code: str, payload: IssueCreate):
    try:
        return kb.add_sub_option(category_code, payload.code, payload.title, payload.steps)
    except ValueError as e:
        raise HTTPException(status_code=400, detail=str(e))


@router.put("/admin/categories/{category_code}/issues/{sub_code}")
def update_issue(category_code: str, sub_code: str, payload: IssueUpdate):
    try:
        return kb.update_sub_option(category_code, sub_code, payload.title, payload.steps)
    except ValueError as e:
        raise HTTPException(status_code=404, detail=str(e))


@router.delete("/admin/categories/{category_code}/issues/{sub_code}")
def delete_issue(category_code: str, sub_code: str):
    try:
        kb.delete_sub_option(category_code, sub_code)
        return {"status": "success"}
    except ValueError as e:
        raise HTTPException(status_code=404, detail=str(e))