from fastapi import APIRouter, Depends, HTTPException, status
from sqlalchemy.orm import Session
from typing import List, Dict, Any
from app.database import get_db
from app.crud.site_config import site_config_crud
from app.schemas.site_config import SiteConfigCreate, SiteConfigUpdate, SiteConfigResponse
from app.core.deps import get_current_admin_user

router = APIRouter(prefix="/site-config", tags=["site-config"])


@router.get("/", response_model=List[SiteConfigResponse])
def get_all_configs(
    current_user = Depends(get_current_admin_user),
    db: Session = Depends(get_db)
):
    """Obtenir toutes les configurations (admin seulement)"""
    configs = site_config_crud.get_all(db)
    return configs


@router.get("/public", response_model=Dict[str, str])
def get_public_configs(db: Session = Depends(get_db)):
    """Obtenir les configurations publiques"""
    configs = site_config_crud.get_public_configs(db)
    return configs


@router.get("/group/{group}", response_model=List[SiteConfigResponse])
def get_configs_by_group(
    group: str,
    current_user = Depends(get_current_admin_user),
    db: Session = Depends(get_db)
):
    """Obtenir les configurations par groupe (admin seulement)"""
    configs = site_config_crud.get_by_group(db, group)
    return configs


@router.get("/{config_id}", response_model=SiteConfigResponse)
def get_config(
    config_id: int,
    current_user = Depends(get_current_admin_user),
    db: Session = Depends(get_db)
):
    """Obtenir une configuration par ID (admin seulement)"""
    config = site_config_crud.get_by_id(db, config_id)
    if not config:
        raise HTTPException(
            status_code=status.HTTP_404_NOT_FOUND,
            detail="Configuration non trouvée"
        )
    return config


@router.post("/", response_model=SiteConfigResponse)
def create_config(
    config_create: SiteConfigCreate,
    current_user = Depends(get_current_admin_user),
    db: Session = Depends(get_db)
):
    """Créer une nouvelle configuration (admin seulement)"""
    # Vérifier si la clé existe déjà
    if site_config_crud.get_by_key(db, config_create.key):
        raise HTTPException(
            status_code=status.HTTP_400_BAD_REQUEST,
            detail="Une configuration avec cette clé existe déjà"
        )
    
    config = site_config_crud.create(db, config_create)
    return config


@router.put("/{config_id}", response_model=SiteConfigResponse)
def update_config(
    config_id: int,
    config_update: SiteConfigUpdate,
    current_user = Depends(get_current_admin_user),
    db: Session = Depends(get_db)
):
    """Mettre à jour une configuration (admin seulement)"""
    config = site_config_crud.get_by_id(db, config_id)
    if not config:
        raise HTTPException(
            status_code=status.HTTP_404_NOT_FOUND,
            detail="Configuration non trouvée"
        )
    
    updated_config = site_config_crud.update(db, config_id, config_update)
    return updated_config


@router.put("/key/{key}")
def update_config_by_key(
    key: str,
    value: str,
    current_user = Depends(get_current_admin_user),
    db: Session = Depends(get_db)
):
    """Mettre à jour une configuration par clé (admin seulement)"""
    config = site_config_crud.get_by_key(db, key)
    if not config:
        raise HTTPException(
            status_code=status.HTTP_404_NOT_FOUND,
            detail="Configuration non trouvée"
        )
    
    updated_config = site_config_crud.update_by_key(db, key, value)
    return updated_config


@router.delete("/{config_id}")
def delete_config(
    config_id: int,
    current_user = Depends(get_current_admin_user),
    db: Session = Depends(get_db)
):
    """Supprimer une configuration (admin seulement)"""
    config = site_config_crud.get_by_id(db, config_id)
    if not config:
        raise HTTPException(
            status_code=status.HTTP_404_NOT_FOUND,
            detail="Configuration non trouvée"
        )
    
    success = site_config_crud.delete(db, config_id)
    if not success:
        raise HTTPException(
            status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
            detail="Erreur lors de la suppression"
        )
    
    return {"message": "Configuration supprimée avec succès"}


@router.get("/value/{key}")
def get_config_value(key: str, db: Session = Depends(get_db)):
    """Obtenir la valeur d'une configuration par clé"""
    value = site_config_crud.get_value(db, key)
    if value is None:
        raise HTTPException(
            status_code=status.HTTP_404_NOT_FOUND,
            detail="Configuration non trouvée"
        )
    return {"key": key, "value": value}
