"""AI Model Center & Registry Governance Endpoints."""
from __future__ import annotations

from typing import Any

from fastapi import APIRouter, Depends, HTTPException
from pydantic import BaseModel

from backend.app.api.v1.auth import get_current_user
from backend.app.market_data.feed_manager import feed_manager
from backend.app.models.registry import model_registry
from backend.app.models.retraining import retraining_pipeline

router = APIRouter(prefix="/models", tags=["AI Models"])


class PromoteModelRequest(BaseModel):
    version: str


@router.get("")
async def list_models() -> list[dict[str, Any]]:
    """List all models in the Champion/Challenger registry."""
    return model_registry.list_models()


@router.post("/train")
async def train_candidate_model(
    symbol: str = "BTCUSDT",
    user: dict[str, Any] = Depends(get_current_user),
) -> dict[str, Any]:
    """Train new model candidate and register as CHALLENGER (never automatically promoted)."""
    candles = feed_manager.fetch_klines(symbol, "15m", 300)
    result = retraining_pipeline.train_candidate(candles)
    return result


@router.post("/promote")
async def promote_model(
    req: PromoteModelRequest,
    user: dict[str, Any] = Depends(get_current_user),
) -> dict[str, Any]:
    """Manually promote Challenger model to Champion with administrator credentials."""
    if user.get("role") != "admin":
        raise HTTPException(status_code=403, detail="Administrator privileges required to promote models.")
    try:
        model_registry.promote_challenger(req.version, authorized_by=user.get("sub", "ADMIN"))
        return {"success": True, "message": f"Model {req.version} successfully promoted to Champion."}
    except Exception as e:
        raise HTTPException(status_code=400, detail=str(e))


@router.post("/rollback")
async def rollback_model(
    req: PromoteModelRequest,
    user: dict[str, Any] = Depends(get_current_user),
) -> dict[str, Any]:
    """Roll back to an earlier retired model."""
    if user.get("role") != "admin":
        raise HTTPException(status_code=403, detail="Administrator privileges required to rollback models.")
    try:
        model_registry.rollback(req.version, authorized_by=user.get("sub", "ADMIN"))
        return {"success": True, "message": f"Model successfully rolled back to {req.version}."}
    except Exception as e:
        raise HTTPException(status_code=400, detail=str(e))
