"""routers/scenarios.py — Scenario CRUD (admin) + list (learner)."""
from typing import Optional
from fastapi import APIRouter, Depends, HTTPException

from models.schemas import Scenario, ScenarioCreate, ScenarioUpdate
from services import store
from services.auth import require_admin
from services.openai_service import generate_scenario_from_prompt

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


# ── Public ────────────────────────────────────────────────────────────────────

@router.get("", response_model=list[Scenario])
async def list_scenarios(status: Optional[str] = None):
    """Learners see live scenarios; admins can filter by status."""
    return await store.list_scenarios(status=status)


@router.get("/{sid}", response_model=Scenario)
async def get_scenario(sid: str):
    sc = await store.get_scenario(sid)
    if not sc:
        raise HTTPException(404, "Scenario not found")
    return sc


# ── Admin ─────────────────────────────────────────────────────────────────────

@router.post("", response_model=Scenario)
async def create_scenario(body: ScenarioCreate, _=Depends(require_admin)):
    return await store.create_scenario(body)


@router.put("/{sid}", response_model=Scenario)
async def update_scenario(sid: str, body: ScenarioUpdate, _=Depends(require_admin)):
    sc = await store.update_scenario(sid, body)
    if not sc:
        raise HTTPException(404, "Scenario not found")
    return sc


@router.patch("/{sid}", response_model=Scenario)
async def patch_scenario(sid: str, patch: dict, _=Depends(require_admin)):
    sc = await store.patch_scenario(sid, patch)
    if not sc:
        raise HTTPException(404, "Scenario not found")
    return sc


@router.delete("/{sid}")
async def delete_scenario(sid: str, _=Depends(require_admin)):
    ok = await store.delete_scenario(sid)
    if not ok:
        raise HTTPException(404, "Scenario not found")
    return {"success": True, "id": sid}


# ── AI generator ──────────────────────────────────────────────────────────────

@router.post("/generate/ai")
async def ai_generate(body: dict, _=Depends(require_admin)):
    prompt = body.get("prompt", "").strip()
    if not prompt:
        raise HTTPException(422, "prompt is required")
    result = await generate_scenario_from_prompt(prompt)
    return result
