from typing import Optional
from fastapi import APIRouter, Depends, HTTPException
from pydantic import BaseModel
from sqlalchemy.ext.asyncio import AsyncSession

from app.database import get_db
from app.services import strategy_service

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


class StrategyUpdateRequest(BaseModel):
    enabled: Optional[bool] = None
    weight: Optional[float] = None
    params: Optional[dict] = None


@router.get("")
async def list_strategies(db: AsyncSession = Depends(get_db)):
    """List all registered strategies."""
    strategies = await strategy_service.get_all_strategies(db)
    return {"strategies": [s.to_dict() for s in strategies]}


@router.put("/{name}")
async def update_strategy(
    name: str,
    body: StrategyUpdateRequest,
    db: AsyncSession = Depends(get_db),
):
    """Update a strategy's enabled state, weight, or parameters."""
    updated = await strategy_service.update_strategy(
        db,
        name=name,
        enabled=body.enabled,
        weight=body.weight,
        params=body.params,
    )
    if updated is None:
        raise HTTPException(status_code=404, detail=f"Strategy '{name}' not found")
    return {"strategy": updated.to_dict()}
