from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.orm import Session
from sqlalchemy import desc
from datetime import datetime
from typing import Optional, List
from app.database import get_db
from app.models.bon_livraison import BonLivraison
from pydantic import BaseModel

router = APIRouter(prefix="/api/bons-livraison", tags=["bons_livraison"])


class BLCreate(BaseModel):
    numero: str
    date_str: Optional[str] = None
    projet_id: Optional[int] = None
    projet_nom: Optional[str] = None
    client_nom: Optional[str] = None
    numero_affaire: Optional[str] = None
    nb_pieces: Optional[int] = 0
    poids_total: Optional[float] = 0.0
    date_livraison: Optional[str] = None
    type_transport: Optional[str] = None
    pdf_b64: Optional[str] = None
    commentaire: Optional[str] = None


def _fmt(bl):
    return {
        "id": bl.id,
        "numero": bl.numero,
        "date_creation": bl.date_creation.isoformat() if bl.date_creation else None,
        "date_str": bl.date_str,
        "projet_id": bl.projet_id,
        "projet_nom": bl.projet_nom,
        "client_nom": bl.client_nom,
        "numero_affaire": bl.numero_affaire,
        "nb_pieces": bl.nb_pieces,
        "poids_total": bl.poids_total,
        "imprime": bl.imprime,
        "has_pdf": bool(bl.pdf_b64),
        "date_livraison": bl.date_livraison,
        "type_transport": bl.type_transport,
        "commentaire": bl.commentaire,
    }


@router.get("/")
def list_bls(db: Session = Depends(get_db)):
    return [_fmt(bl) for bl in db.query(BonLivraison).order_by(desc(BonLivraison.date_creation)).all()]


@router.post("/", status_code=201)
def create_bl(data: BLCreate, db: Session = Depends(get_db)):
    bl = BonLivraison(**data.dict())
    db.add(bl); db.commit(); db.refresh(bl)
    return _fmt(bl)


@router.get("/{bl_id}/pdf")
def get_bl_pdf(bl_id: int, db: Session = Depends(get_db)):
    bl = db.query(BonLivraison).filter(BonLivraison.id == bl_id).first()
    if not bl:
        raise HTTPException(404, "BL non trouvé")
    return {"pdf_b64": bl.pdf_b64, "numero": bl.numero}


@router.put("/{bl_id}/imprime")
def marquer_imprime(bl_id: int, db: Session = Depends(get_db)):
    bl = db.query(BonLivraison).filter(BonLivraison.id == bl_id).first()
    if not bl:
        raise HTTPException(404, "BL non trouvé")
    bl.imprime = True
    db.commit()
    return {"ok": True}


@router.delete("/{bl_id}")
def delete_bl(bl_id: int, db: Session = Depends(get_db)):
    bl = db.query(BonLivraison).filter(BonLivraison.id == bl_id).first()
    if not bl:
        raise HTTPException(404, "BL non trouvé")
    db.delete(bl); db.commit()
    return {"ok": True}


class PoidsUpdate(BaseModel):
    poids_total: float


@router.put("/{bl_id}/poids")
def update_poids(bl_id: int, data: PoidsUpdate, db: Session = Depends(get_db)):
    bl = db.query(BonLivraison).filter(BonLivraison.id == bl_id).first()
    if not bl:
        raise HTTPException(404, "BL non trouvé")
    bl.poids_total = data.poids_total
    db.commit()
    return {"ok": True, "poids_total": bl.poids_total}


class PdfUpdate(BaseModel):
    pdf_b64: str


@router.put("/{bl_id}/pdf-update")
def update_pdf(bl_id: int, data: PdfUpdate, db: Session = Depends(get_db)):
    bl = db.query(BonLivraison).filter(BonLivraison.id == bl_id).first()
    if not bl:
        raise HTTPException(404, "BL non trouvé")
    bl.pdf_b64 = data.pdf_b64
    db.commit()
    return {"ok": True}


class CommentaireUpdate(BaseModel):
    commentaire: Optional[str] = None


@router.put("/{bl_id}/commentaire")
def update_commentaire(bl_id: int, data: CommentaireUpdate, db: Session = Depends(get_db)):
    bl = db.query(BonLivraison).filter(BonLivraison.id == bl_id).first()
    if not bl:
        raise HTTPException(404, "BL non trouvé")
    bl.commentaire = data.commentaire
    db.commit()
    return {"ok": True}
