from datetime import date

from fastapi import APIRouter, Depends, Form, HTTPException, Request
from fastapi.responses import RedirectResponse
from fastapi.templating import Jinja2Templates
from sqlalchemy.orm import Session

from app import models
from app.database import get_db
from app.securite import verifier_jeton_csrf
from app.utils import vers_float, vers_int

router = APIRouter(prefix="/station", tags=["station"])
templates = Jinja2Templates(directory="app/templates")


@router.get("")
def liste_entrees(request: Request, db: Session = Depends(get_db)):
    entrees = (
        db.query(models.EntreeMarchandise)
        .order_by(models.EntreeMarchandise.date_entree.desc(), models.EntreeMarchandise.id.desc())
        .all()
    )
    return templates.TemplateResponse(
        "station/liste.html", {"request": request, "entrees": entrees}
    )


@router.get("/nouveau")
def formulaire_entree(request: Request, db: Session = Depends(get_db)):
    parcelles = db.query(models.Parcelle).order_by(models.Parcelle.nom).all()
    return templates.TemplateResponse(
        "station/formulaire.html", {"request": request, "entree": None, "parcelles": parcelles}
    )


@router.post("/nouveau", dependencies=[Depends(verifier_jeton_csrf)])
def creer_entree(
    date_entree: date = Form(...),
    parcelle_id: str | None = Form(None),
    produit: str = Form(...),
    poids_entree_kg: float = Form(...),
    poids_sortie_kg: str | None = Form(None),
    type_sortie: str | None = Form(None),
    destination: str | None = Form(None),
    notes: str | None = Form(None),
    db: Session = Depends(get_db),
):
    db.add(
        models.EntreeMarchandise(
            date_entree=date_entree,
            parcelle_id=vers_int(parcelle_id),
            produit=produit,
            poids_entree_kg=poids_entree_kg,
            poids_sortie_kg=vers_float(poids_sortie_kg),
            type_sortie=type_sortie or None,
            destination=destination,
            notes=notes,
        )
    )
    db.commit()
    return RedirectResponse(url="/station?succes=Entrée enregistrée", status_code=303)


@router.get("/{entree_id}/modifier")
def formulaire_modif_entree(entree_id: int, request: Request, db: Session = Depends(get_db)):
    entree = db.get(models.EntreeMarchandise, entree_id)
    if entree is None:
        raise HTTPException(status_code=404, detail="Entrée introuvable")
    parcelles = db.query(models.Parcelle).order_by(models.Parcelle.nom).all()
    return templates.TemplateResponse(
        "station/formulaire.html", {"request": request, "entree": entree, "parcelles": parcelles}
    )


@router.post("/{entree_id}/modifier", dependencies=[Depends(verifier_jeton_csrf)])
def modifier_entree(
    entree_id: int,
    date_entree: date = Form(...),
    parcelle_id: str | None = Form(None),
    produit: str = Form(...),
    poids_entree_kg: float = Form(...),
    poids_sortie_kg: str | None = Form(None),
    type_sortie: str | None = Form(None),
    destination: str | None = Form(None),
    notes: str | None = Form(None),
    db: Session = Depends(get_db),
):
    entree = db.get(models.EntreeMarchandise, entree_id)
    if entree is None:
        raise HTTPException(status_code=404, detail="Entrée introuvable")
    entree.date_entree = date_entree
    entree.parcelle_id = vers_int(parcelle_id)
    entree.produit = produit
    entree.poids_entree_kg = poids_entree_kg
    entree.poids_sortie_kg = vers_float(poids_sortie_kg)
    entree.type_sortie = type_sortie or None
    entree.destination = destination
    entree.notes = notes
    db.commit()
    return RedirectResponse(url="/station?succes=Entrée mise à jour", status_code=303)


@router.post("/{entree_id}/supprimer", dependencies=[Depends(verifier_jeton_csrf)])
def supprimer_entree(entree_id: int, db: Session = Depends(get_db)):
    entree = db.get(models.EntreeMarchandise, entree_id)
    if entree is None:
        raise HTTPException(status_code=404, detail="Entrée introuvable")
    db.delete(entree)
    db.commit()
    return RedirectResponse(url="/station?succes=Entrée supprimée", status_code=303)
