import uuid
from typing import List

from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.orm import Session, joinedload

from app.database import get_db
from app.models.graft_combination import GraftCombination
from app.schemas.graft_combination import GraftCombinationResponse

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

_with_plants = [
    joinedload(GraftCombination.rootstock),
    joinedload(GraftCombination.scion),
]


@router.get("", response_model=List[GraftCombinationResponse])
def list_grafts(db: Session = Depends(get_db)):
    return (
        db.query(GraftCombination)
        .options(*_with_plants)
        .order_by(GraftCombination.compatibility_score.desc())
        .all()
    )


@router.get("/compatible/{plant_id}", response_model=List[GraftCombinationResponse])
def compatible_grafts(plant_id: uuid.UUID, db: Session = Depends(get_db)):
    """Return all graft combinations that involve the given plant (as either rootstock or scion)."""
    results = (
        db.query(GraftCombination)
        .options(*_with_plants)
        .filter(
            (GraftCombination.rootstock_id == plant_id)
            | (GraftCombination.scion_id == plant_id)
        )
        .order_by(GraftCombination.compatibility_score.desc())
        .all()
    )
    if not results:
        raise HTTPException(status_code=404, detail="No compatible grafts found for this plant")
    return results
