from fastapi import APIRouter, Depends, Query, status
from sqlalchemy.orm import Session
from typing import Optional, List
from utils.utils import get_db
from . import handler
from .schema import PlatformsettingCreate, PlatformsettingUpdate, PlatformsettingResponse, SettingType

router = APIRouter(prefix="/platform-settings", tags=["Platform Settings"])


@router.post(
    "/",
    response_model=PlatformsettingResponse,
    status_code=status.HTTP_201_CREATED,
    summary="Create Platform Setting",
    description="Creates a new platform setting with a unique key. Returns 409 if the setting key already exists."
)
def create_platformsetting_route(data: PlatformsettingCreate, db: Session = Depends(get_db)):
    return handler.create_platformsetting(db, data)


@router.get(
    "/",
    response_model=List[PlatformsettingResponse],
    summary="List Platform Settings",
    description="Returns a paginated list of platform settings. Supports optional filtering by setting type and search term on key and description fields."
)
def list_platformsettings_route(
    limit: int = Query(20, ge=1, le=100),
    offset: int = Query(0, ge=0),
    setting_type: Optional[SettingType] = Query(None),
    search: Optional[str] = None,
    db: Session = Depends(get_db)
):
    return handler.list_platformsettings(db, limit, offset, setting_type, search)


@router.get(
    "/by-key/{setting_key}",
    response_model=PlatformsettingResponse,
    summary="Get Platform Setting By Key",
    description="Retrieves a platform setting by its unique key. Returns 404 if the setting key is not found."
)
def get_platformsetting_by_key_route(setting_key: str, db: Session = Depends(get_db)):
    return handler.get_platformsetting_by_key(db, setting_key)


@router.get(
    "/{id}",
    response_model=PlatformsettingResponse,
    summary="Get Platform Setting",
    description="Retrieves a platform setting by its ID. Returns 404 if the setting is not found."
)
def get_platformsetting_route(id: str, db: Session = Depends(get_db)):
    return handler.get_platformsetting(db, id)


@router.put(
    "/{id}",
    response_model=PlatformsettingResponse,
    summary="Update Platform Setting",
    description="Updates an existing platform setting. Only provided fields are updated. Returns 404 if the setting is not found, 409 if the new key conflicts with an existing setting."
)
def update_platformsetting_route(
    id: str,
    data: PlatformsettingUpdate,
    db: Session = Depends(get_db)
):
    return handler.update_platformsetting(db, id, data)


@router.delete(
    "/{id}",
    status_code=status.HTTP_200_OK,
    summary="Delete Platform Setting",
    description="Deletes a platform setting by its ID. Returns 404 if the setting is not found."
)
def delete_platformsetting_route(id: str, db: Session = Depends(get_db)):
    return handler.delete_platformsetting(db, id)