"""
Routes API pour la gestion des projets
"""
from fastapi import APIRouter, Depends, HTTPException, Query
from sqlalchemy.orm import Session
from sqlalchemy import func
from typing import List, Optional
from datetime import datetime
from app.database import get_db
from app.models.projet import Projet, Niveau, Piece
from app.schemas.projet import ProjetCreate, ProjetUpdate, ProjetResponse

router = APIRouter(prefix="/api/projets", tags=["Projets"])


@router.get("/", response_model=List[ProjetResponse])
def lire_projets(
    skip: int = Query(0, ge=0),
    limit: int = Query(100, ge=1, le=1000),
    statut: Optional[str] = None,
    actif: Optional[int] = None,
    recherche: Optional[str] = None,
    db: Session = Depends(get_db)
):
    query = db.query(Projet)
    if statut:
        query = query.filter(Projet.statut == statut)
    if actif is not None:
        query = query.filter(Projet.actif == actif)
    if recherche:
        query = query.filter(
            (Projet.nom.ilike(f"%{recherche}%")) |
            (Projet.numero_affaire.ilike(f"%{recherche}%")) |
            (Projet.ville_chantier.ilike(f"%{recherche}%"))
        )
    projets = query.order_by(Projet.date_creation.desc()).offset(skip).limit(limit).all()
    return projets


@router.get("/archives/liste", response_model=List[ProjetResponse])
def lire_archives(db: Session = Depends(get_db)):
    """
    Récupère tous les projets archivés
    """
    projets = db.query(Projet).filter(
        Projet.statut == "archive"
    ).order_by(Projet.date_archivage.desc()).all()
    return projets


@router.get("/{projet_id}", response_model=ProjetResponse)
def lire_projet(projet_id: int, db: Session = Depends(get_db)):
    projet = db.query(Projet).filter(Projet.id == projet_id).first()
    if not projet:
        raise HTTPException(status_code=404, detail="Projet non trouvé")
    return projet


@router.post("/", response_model=ProjetResponse, status_code=201)
def creer_projet(projet: ProjetCreate, db: Session = Depends(get_db)):
    if db.query(Projet).filter(Projet.numero_affaire == projet.numero_affaire).first():
        raise HTTPException(status_code=400, detail="Ce numéro d'affaire existe déjà")
    db_projet = Projet(**projet.model_dump())
    db.add(db_projet)
    db.commit()
    db.refresh(db_projet)
    return db_projet


@router.put("/{projet_id}", response_model=ProjetResponse)
def modifier_projet(
    projet_id: int,
    projet_update: ProjetUpdate,
    db: Session = Depends(get_db)
):
    db_projet = db.query(Projet).filter(Projet.id == projet_id).first()
    if not db_projet:
        raise HTTPException(status_code=404, detail="Projet non trouvé")
    update_data = projet_update.model_dump(exclude_unset=True)
    for field, value in update_data.items():
        setattr(db_projet, field, value)
    db.commit()
    db.refresh(db_projet)
    return db_projet


@router.put("/{projet_id}/archiver", response_model=ProjetResponse)
def archiver_projet(projet_id: int, db: Session = Depends(get_db)):
    """
    Archive un projet (soft delete)
    """
    db_projet = db.query(Projet).filter(Projet.id == projet_id).first()
    if not db_projet:
        raise HTTPException(status_code=404, detail="Projet non trouvé")
    db_projet.statut = "archive"
    db_projet.actif = 0
    db_projet.date_archivage = datetime.now()
    db.commit()
    db.refresh(db_projet)
    return db_projet


@router.delete("/{projet_id}", status_code=204)
def supprimer_projet(projet_id: int, db: Session = Depends(get_db)):
    """
    Suppression définitive d'un projet
    """
    db_projet = db.query(Projet).filter(Projet.id == projet_id).first()
    if not db_projet:
        raise HTTPException(status_code=404, detail="Projet non trouvé")
    db.delete(db_projet)
    db.commit()
    return None


@router.post("/{projet_id}/restaurer", response_model=ProjetResponse)
def restaurer_projet(projet_id: int, db: Session = Depends(get_db)):
    """
    Restaure un projet archivé
    """
    db_projet = db.query(Projet).filter(Projet.id == projet_id).first()
    if not db_projet:
        raise HTTPException(status_code=404, detail="Projet non trouvé")
    db_projet.actif = 1
    db_projet.statut = "en_cours"
    db.commit()
    db.refresh(db_projet)
    return db_projet


@router.post("/{projet_id}/recalculer")
def recalculer_projet(projet_id: int, db: Session = Depends(get_db)):
    """
    Recalcule les totaux du projet
    """
    db_projet = db.query(Projet).filter(Projet.id == projet_id).first()
    if not db_projet:
        raise HTTPException(status_code=404, detail="Projet non trouvé")
    pieces = db.query(Piece).filter(Piece.projet_id == projet_id).all()
    poids_total = sum(p.poids_total for p in pieces)
    convoi = any(p.convoi_exceptionnel for p in pieces)
    nb_transports = max(1, int(poids_total / 20)) if poids_total > 0 else 0
    db_projet.poids_total = poids_total
    db_projet.nb_transports = nb_transports
    db_projet.convoi_exceptionnel = convoi
    db.commit()
    db.refresh(db_projet)
    return {
        "poids_total": poids_total,
        "nb_transports": nb_transports,
        "convoi_exceptionnel": convoi
    }