from fastapi import APIRouter, Depends
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy import select
from app.database import get_db
from app.models.app_setting import AppSetting
from app.models.user import User
from app.deps import require_role

router = APIRouter(prefix="/app-settings", tags=["app-settings"])

ALLOWED_KEYS = {
    "telegram_user_group_id",
    "telegram_admin_group_id",
    "telegram_thread_task",
    "telegram_thread_letter",
    "telegram_thread_contract",
    "telegram_thread_document",
}


@router.get("")
async def get_settings(
    db: AsyncSession = Depends(get_db),
    _: User = Depends(require_role("admin")),
):
    result = await db.execute(select(AppSetting).where(AppSetting.key.in_(ALLOWED_KEYS)))
    rows = result.scalars().all()
    return {r.key: r.value for r in rows}


@router.patch("/{key}")
async def update_setting(
    key: str,
    body: dict,
    db: AsyncSession = Depends(get_db),
    _: User = Depends(require_role("admin")),
):
    if key not in ALLOWED_KEYS:
        from fastapi import HTTPException
        raise HTTPException(400, f"Unknown setting key: {key}")

    value = body.get("value", "")
    setting = await db.get(AppSetting, key)
    if setting:
        setting.value = value
    else:
        db.add(AppSetting(key=key, value=value))
    await db.commit()
    return {"key": key, "value": value}
