"""
Routes API pour la gestion des catégories
"""
from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.orm import Session
from typing import List
from app.database import get_db
from app.models import Categorie, Article, StatutArticle
from app.schemas.categorie import (
    CategorieCreate,
    CategorieUpdate,
    CategorieResponse,
    CategorieArbre
)

router = APIRouter(prefix="/api/categories", tags=["Catégories"])


@router.get("/", response_model=List[CategorieResponse])
def lire_categories(db: Session = Depends(get_db)):
    """Récupère toutes les catégories"""
    categories = db.query(Categorie).all()
    return categories


@router.get("/arbre", response_model=List[CategorieArbre])
def lire_arbre_categories(db: Session = Depends(get_db)):
    """Récupère l'arborescence complète des catégories"""
    categories_racines = db.query(Categorie).filter(Categorie.parent_id == None).all()
    
    def construire_arbre(categorie: Categorie) -> CategorieArbre:
        nombre_articles = db.query(Article).filter(Article.categorie_id == categorie.id).count()
        arbre = CategorieArbre(
            id=categorie.id,
            nom=categorie.nom,
            icone=categorie.icone,
            niveau=categorie.niveau,
            parent_id=categorie.parent_id,
            chemin_complet=categorie.chemin_complet,
            nombre_articles=nombre_articles,
            enfants=[construire_arbre(enfant) for enfant in categorie.enfants]
        )
        return arbre
    
    return [construire_arbre(cat) for cat in categories_racines]


@router.get("/{categorie_id}", response_model=CategorieResponse)
def lire_categorie(categorie_id: int, db: Session = Depends(get_db)):
    """Récupère une catégorie spécifique"""
    categorie = db.query(Categorie).filter(Categorie.id == categorie_id).first()
    if not categorie:
        raise HTTPException(status_code=404, detail="Catégorie non trouvée")
    return categorie


@router.post("/", response_model=CategorieResponse, status_code=201)
def creer_categorie(categorie: CategorieCreate, db: Session = Depends(get_db)):
    """Crée une nouvelle catégorie"""
    if categorie.parent_id:
        parent = db.query(Categorie).filter(Categorie.id == categorie.parent_id).first()
        if not parent:
            raise HTTPException(status_code=404, detail="Catégorie parente non trouvée")
    
    db_categorie = Categorie(**categorie.model_dump())
    db.add(db_categorie)
    db.commit()
    db.refresh(db_categorie)
    return db_categorie


@router.put("/{categorie_id}", response_model=CategorieResponse)
def modifier_categorie(categorie_id: int, categorie_update: CategorieUpdate, db: Session = Depends(get_db)):
    """Modifie une catégorie existante"""
    db_categorie = db.query(Categorie).filter(Categorie.id == categorie_id).first()
    if not db_categorie:
        raise HTTPException(status_code=404, detail="Catégorie non trouvée")
    
    update_data = categorie_update.model_dump(exclude_unset=True)
    for field, value in update_data.items():
        setattr(db_categorie, field, value)
    
    db.commit()
    db.refresh(db_categorie)
    return db_categorie


@router.delete("/{categorie_id}", status_code=204)
def supprimer_categorie(categorie_id: int, db: Session = Depends(get_db)):
    db_categorie = db.query(Categorie).filter(Categorie.id == categorie_id).first()
    if not db_categorie:
        raise HTTPException(status_code=404, detail="Catégorie non trouvée")

    if db.query(Article).filter(
        Article.categorie_id == categorie_id,
        Article.statut != StatutArticle.ARCHIVE
    ).count() > 0:
        raise HTTPException(400, "Impossible de supprimer une catégorie contenant des articles actifs")

    if len(db_categorie.enfants) > 0:
        raise HTTPException(status_code=400, detail="Impossible de supprimer une catégorie ayant des sous-catégories")

    # Supprimer d'abord les articles archivés
    db.query(Article).filter(
        Article.categorie_id == categorie_id,
        Article.statut == StatutArticle.ARCHIVE
    ).delete()

    db.delete(db_categorie)
    db.commit()
    return None

    db.delete(db_categorie)
    db.commit()
    return None