"""
Routes API pour la gestion des niveaux d'un projet
"""
from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.orm import Session
from typing import List
from app.database import get_db
from app.models.projet import Niveau
from app.schemas.niveau import NiveauCreate, NiveauUpdate, NiveauResponse

router = APIRouter(prefix="/api/niveaux", tags=["Niveaux"])


@router.get("/projet/{projet_id}", response_model=List[NiveauResponse])
def lire_niveaux_projet(projet_id: int, db: Session = Depends(get_db)):
    """
    Récupère tous les niveaux d'un projet
    """
    niveaux = db.query(Niveau).filter(Niveau.projet_id == projet_id).order_by(Niveau.ordre).all()
    return niveaux


@router.get("/{niveau_id}", response_model=NiveauResponse)
def lire_niveau(niveau_id: int, db: Session = Depends(get_db)):
    """
    Récupère un niveau spécifique par son ID
    """
    niveau = db.query(Niveau).filter(Niveau.id == niveau_id).first()
    if not niveau:
        raise HTTPException(status_code=404, detail="Niveau non trouvé")
    return niveau


@router.post("/", response_model=NiveauResponse, status_code=201)
def creer_niveau(niveau: NiveauCreate, db: Session = Depends(get_db)):
    """
    Crée un nouveau niveau pour un projet
    """
    db_niveau = Niveau(**niveau.model_dump())
    db.add(db_niveau)
    db.commit()
    db.refresh(db_niveau)
    return db_niveau


@router.put("/{niveau_id}", response_model=NiveauResponse)
def modifier_niveau(
    niveau_id: int,
    niveau_update: NiveauUpdate,
    db: Session = Depends(get_db)
):
    """
    Modifie un niveau existant
    """
    db_niveau = db.query(Niveau).filter(Niveau.id == niveau_id).first()
    if not db_niveau:
        raise HTTPException(status_code=404, detail="Niveau non trouvé")
    
    update_data = niveau_update.model_dump(exclude_unset=True)
    for field, value in update_data.items():
        setattr(db_niveau, field, value)
    
    db.commit()
    db.refresh(db_niveau)
    return db_niveau


@router.delete("/{niveau_id}", status_code=204)
def supprimer_niveau(niveau_id: int, db: Session = Depends(get_db)):
    """
    Supprime un niveau (cascade delete des pièces)
    """
    db_niveau = db.query(Niveau).filter(Niveau.id == niveau_id).first()
    if not db_niveau:
        raise HTTPException(status_code=404, detail="Niveau non trouvé")
    
    db.delete(db_niveau)
    db.commit()
    return None
