from fastapi import APIRouter, Depends
from pydantic import BaseModel
from sqlalchemy import select
from sqlalchemy.ext.asyncio import AsyncSession
from typing import Dict

from app.database import get_db
from app.models.settings_model import AppSettings
from datetime import datetime

router = APIRouter(prefix="/api/v1/settings", tags=["settings"])


@router.get("")
async def get_settings(db: AsyncSession = Depends(get_db)):
    """Return all settings as a key-value dict."""
    result = await db.execute(select(AppSettings))
    settings_rows = result.scalars().all()
    return {"settings": {row.key: row.value for row in settings_rows}}


class SettingsUpdateRequest(BaseModel):
    settings: Dict[str, str]


@router.put("")
async def update_settings(
    body: SettingsUpdateRequest, db: AsyncSession = Depends(get_db)
):
    """Upsert one or more settings key-value pairs."""
    for key, value in body.settings.items():
        result = await db.execute(select(AppSettings).where(AppSettings.key == key))
        row = result.scalar_one_or_none()
        if row:
            row.value = value
            row.updated_at = datetime.utcnow()
        else:
            db.add(AppSettings(key=key, value=value, updated_at=datetime.utcnow()))
    await db.commit()
    return {"message": "Settings updated", "updated_keys": list(body.settings.keys())}
