from fastapi import APIRouter, Depends, Response
import structlog

from .models.requests import CreateRestaurantOfferRequest
from ...shared.middleware.auth import verify_create_restaurant_offer_auth

router = APIRouter(prefix="/restaurant-offer", tags=["create_restaurant_offer"])
logger = structlog.get_logger("create_restaurant_offer.routes")

create_restaurant_offer_service = None
VERSION = "1.0.0"


def set_create_restaurant_offer_service(service):
    """Set the create_restaurant_offer service instance"""
    global create_restaurant_offer_service
    create_restaurant_offer_service = service


@router.post(
    "/create",
    response_class=Response,
    dependencies=[Depends(verify_create_restaurant_offer_auth)]
)
async def create_restaurant_offer(request: CreateRestaurantOfferRequest):
    """Create a themed promotional offer image for a restaurant occasion."""
    selected_model = request.model.strip() if request.model and request.model.strip() else None
    has_visual_prompt = bool((request.visual_prompt or "").strip())

    logger.info(
        "create_restaurant_offer_request",
        offer_id=request.offer_id,
        occasion=request.occasion,
        model=selected_model,
        has_visual_prompt=has_visual_prompt,
        mock_data=request.mock_data,
        logo_url_present=bool(request.logo_image_url.strip()),
        offer_items_length=len(request.offer_items)
    )

    result = await create_restaurant_offer_service.create_restaurant_offer(request)

    logger.info(
        "create_restaurant_offer_response",
        offer_id=request.offer_id,
        model=result["model"],
        total_tokens=result["total_tokens"],
        price_usd=result["price_usd"],
        mock=request.mock_data,
    )

    return Response(
        content=result["image_bytes"],
        media_type="image/png",
        headers={
            "X-Model": result["model"],
            "X-Tokens-Input": str(result["input_tokens"]),
            "X-Tokens-Output": str(result["output_tokens"]),
            "X-Tokens-Total": str(result["total_tokens"]),
            "X-Price-USD": str(result["price_usd"]) if result["price_usd"] is not None else "",
            "X-Version": VERSION,
        },
    )
