import logging
from typing import List, Optional
from sqlalchemy import select
from sqlalchemy.ext.asyncio import AsyncSession

from app.models.strategy import Strategy

logger = logging.getLogger(__name__)


async def get_all_strategies(db: AsyncSession) -> List[Strategy]:
    result = await db.execute(select(Strategy))
    return result.scalars().all()


async def get_strategy_by_name(db: AsyncSession, name: str) -> Optional[Strategy]:
    result = await db.execute(select(Strategy).where(Strategy.name == name))
    return result.scalar_one_or_none()


async def update_strategy(
    db: AsyncSession,
    name: str,
    enabled: Optional[bool] = None,
    weight: Optional[float] = None,
    params: Optional[dict] = None,
) -> Optional[Strategy]:
    strategy = await get_strategy_by_name(db, name)
    if strategy is None:
        return None

    if enabled is not None:
        strategy.enabled = enabled
    if weight is not None:
        strategy.weight = weight
    if params is not None:
        strategy.params = {**(strategy.params or {}), **params}

    await db.commit()
    await db.refresh(strategy)
    return strategy
