from fastapi import APIRouter, Depends, HTTPException, status
from sqlalchemy import and_
from sqlalchemy.orm import Session
from sqlalchemy.exc import IntegrityError
from models.nichos import Nichos
from schemas.nichos import NichosCreate, NichosOut, NichosUpdate, NichosSearch
from database import get_db

router = APIRouter()

# Crear un nuevo nichos
@router.post("/", response_model=NichosOut)
def create_nichos(nichos: NichosCreate, db: Session = Depends(get_db)):
    if nichos.id_nivel_panteon is None:
        raise HTTPException(
            status_code=status.HTTP_400_BAD_REQUEST,
            detail="El campo id_nivel_panteon es obligatorio"
        )

    db_nichos = Nichos(fecha_ingreso=nichos.fecha_ingreso, id_nivel_panteon=nichos.id_nivel_panteon)
    db.add(db_nichos)
    db.commit()
    db.refresh(db_nichos)

    return db_nichos  # SQLAlchemy convertirá el objeto correctamente

# actualiza el numero de Nicho
@router.put("/{id}", response_model=NichosOut)
def update_nichos(id: int, pinichossos: NichosUpdate, db: Session = Depends(get_db)):
    # Buscar el nicho en la base de datos
    existing_nichos = db.query(Nichos).filter(Nichos.id == id).first()
    
    # Si el nicho no existe, lanzamos un error 404
    if not existing_nichos:
        raise HTTPException(status_code=404, detail="Nicho no encontrado")
    
    # Actualizamos los campos con los valores proporcionados
    # update_data = nichos.model_dump(exclude_unset=True)  # FastAPI >= 0.95
    update_data = pinichossos.model_dump(exclude_unset=True)  # Cambié de 'nichos' a 'pinichossos'

    for key, value in update_data.items():
        setattr(existing_nichos, key, value)
    
    # Guardamos los cambios en la base de datos
    db.commit()
    db.refresh(existing_nichos)  # Asegura que obtenemos los datos actualizados
    
    # Retornar el nichos actualizado
    return existing_nichos

# Eliminar nichos
@router.delete("/{id}")
def delete_nichos(id: int, db: Session = Depends(get_db)):
    nichos = db.query(Nichos).filter(Nichos.id == id).first()
    if not nichos:
        raise HTTPException(status_code=404, detail="Nichos no encontrado")
    db.delete(nichos)
    db.commit()
    return {"message": "Nichos eliminado exitosamente"}

@router.post("/buscar", response_model=list[NichosOut])
def search_nichos(filters: NichosSearch, db: Session = Depends(get_db)):
    query = db.query(Nichos)

    # Construir filtros dinámicamente
    conditions = []
    
    if filters.id_nivel_panteon is not None:  # Verificar si id_fila es proporcionado
        conditions.append(Nichos.id_nivel_panteon == filters.id_nivel_panteon)

    if filters.fecha_ingreso:  # Si se proporciona fecha_ingreso
        try:
            fecha = datetime.strptime(filters.fecha_ingreso, "%Y-%m-%d")  # Convertir el string a fecha
            conditions.append(Nichos.fecha_ingreso == fecha)
        except ValueError:
            raise HTTPException(status_code=400, detail="Formato de fecha no válido. Debe ser 'YYYY-MM-DD'")

    if conditions:
        query = query.filter(*conditions)  # Se puede usar *conditions directamente

    nichos = query.all()

    if not nichos:
        raise HTTPException(status_code=404, detail="No se encontró ningún Nicho con esos criterios.")

    return nichos