from fastapi import APIRouter, HTTPException, status, Depends
from sqlalchemy.orm import Session
from database import SessionLocal
from models import Food, FoodCategory
from schemas import Food as FoodSchema, FoodCreate, FoodCategory as FoodCategorySchema, FoodCategoryCreate

router = APIRouter(prefix="/foods", tags=["foods"])

def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()

@router.get("/", response_model=list[FoodSchema])
def list_foods(db: Session = Depends(get_db)):
    return db.query(Food).all()

@router.post("/", response_model=FoodSchema, status_code=status.HTTP_201_CREATED)
def create_food(food: FoodCreate, db: Session = Depends(get_db)):
    db_food = Food(**food.dict())
    db.add(db_food)
    db.commit()
    db.refresh(db_food)
    return db_food

@router.get("/{food_id}", response_model=FoodSchema)
def get_food(food_id: int, db: Session = Depends(get_db)):
    food = db.query(Food).filter(Food.id == food_id).first()
    if not food:
        raise HTTPException(status_code=404, detail="Alimento non trovato")
    return food

@router.put("/{food_id}", response_model=FoodSchema)
def update_food(food_id: int, food: FoodCreate, db: Session = Depends(get_db)):
    db_food = db.query(Food).filter(Food.id == food_id).first()
    if not db_food:
        raise HTTPException(status_code=404, detail="Alimento non trovato")
    for key, value in food.dict().items():
        setattr(db_food, key, value)
    db.commit()
    db.refresh(db_food)
    return db_food

@router.delete("/{food_id}", status_code=status.HTTP_204_NO_CONTENT)
def delete_food(food_id: int, db: Session = Depends(get_db)):
    db_food = db.query(Food).filter(Food.id == food_id).first()
    if not db_food:
        raise HTTPException(status_code=404, detail="Alimento non trovato")
    db.delete(db_food)
    db.commit()
    return None

# CRUD per categorie alimentari
@router.get("/categories/", response_model=list[FoodCategorySchema])
def list_categories(db: Session = Depends(get_db)):
    return db.query(FoodCategory).all()

@router.post("/categories/", response_model=FoodCategorySchema, status_code=status.HTTP_201_CREATED)
def create_category(category: FoodCategoryCreate, db: Session = Depends(get_db)):
    db_cat = FoodCategory(name=category.name)
    db.add(db_cat)
    db.commit()
    db.refresh(db_cat)
    return db_cat

@router.put("/categories/{category_id}", response_model=FoodCategorySchema)
def update_category(category_id: int, category: FoodCategoryCreate, db: Session = Depends(get_db)):
    db_cat = db.query(FoodCategory).filter(FoodCategory.id == category_id).first()
    if not db_cat:
        raise HTTPException(status_code=404, detail="Categoria non trovata")
    db_cat.name = category.name
    db.commit()
    db.refresh(db_cat)
    return db_cat

@router.delete("/categories/{category_id}", status_code=status.HTTP_204_NO_CONTENT)
def delete_category(category_id: int, db: Session = Depends(get_db)):
    db_cat = db.query(FoodCategory).filter(FoodCategory.id == category_id).first()
    if not db_cat:
        raise HTTPException(status_code=404, detail="Categoria non trovata")
    db.delete(db_cat)
    db.commit()
    return None
