import json

from ..exceptions import LLMGenerationError
from ..prompts import stay_system_prompt
from ..providers.factory import get_provider
from ..schemas import RecommendStayRequest


def recommend_stay(payload: RecommendStayRequest) -> dict:
    system_prompt = stay_system_prompt(
        preferences=payload.preferences,
        candidates=payload.candidates,
        num_recommendations=payload.num_recommendations,
    )
    user_content = {
        "itinerary": payload.itinerary,
        "trip_spec": payload.trip_spec.model_dump() if payload.trip_spec else None,
    }
    messages = [{"role": "user", "content": json.dumps(user_content)}]

    try:
        return get_provider().complete_json(system_prompt, messages)
    except Exception as exc:
        raise LLMGenerationError("Failed to recommend accommodation", str(exc)) from exc
