"""
AI Room Designer — Stage 3 runtime config (env-driven, secrets stay server-side).

Nothing here hardcodes a credential. The key is read from the environment at
runtime and never logged, returned to the client, or written into job files.

Env vars:
  ROOM_DESIGNER_PROVIDER      gemini | mock | standin
                              (unset = auto: gemini if a key is present,
                               otherwise mock — and every response states
                               which provider actually ran + dry_run flag)
  ROOM_DESIGNER_API_KEY       Gemini API key (falls back to GEMINI_API_KEY)
  ROOM_DESIGNER_GEMINI_MODEL  default gemini-nano-banana-2.1 (Nano Banana 2.1,
                              the current successor to gemini-2.5-flash-image;
                              gemini-3.1-flash-image / gemini-2.5-flash-image
                              remain selectable here with no code change)
  ROOM_DESIGNER_IMAGE_SIZE    1K (default) | 2K | 4K
  ROOM_DESIGNER_MAX_RETRIES   QC-gate retries after a failed attempt (default 2)
  ROOM_DESIGNER_MOCK_SCRIPT   rig-test only: comma list of mock behaviours
                              cycled per call, e.g. "reframe,grade"
"""
import os

DEFAULT_MODEL = "gemini-nano-banana-2.1"
GEMINI_ENDPOINT = "https://generativelanguage.googleapis.com/v1beta/models/{model}:generateContent"


def api_key():
    return os.environ.get("ROOM_DESIGNER_API_KEY") or os.environ.get("GEMINI_API_KEY") or ""


def provider():
    p = (os.environ.get("ROOM_DESIGNER_PROVIDER") or "").strip().lower()
    if p in ("gemini", "mock", "standin"):
        return p
    return "gemini" if api_key() else "mock"


def model():
    return os.environ.get("ROOM_DESIGNER_GEMINI_MODEL") or DEFAULT_MODEL


def image_size():
    return os.environ.get("ROOM_DESIGNER_IMAGE_SIZE") or "1K"


def max_retries():
    try:
        return max(0, min(5, int(os.environ.get("ROOM_DESIGNER_MAX_RETRIES", "2"))))
    except ValueError:
        return 2


def public_status():
    """What the app may know: provider + whether live generation is real.
    NEVER includes the key itself."""
    p = provider()
    return {
        "provider": p,
        "model": model() if p == "gemini" else None,
        "live": p == "gemini" and bool(api_key()),
        "dry_run": p != "gemini",
        "max_retries": max_retries(),
    }
