from collections.abc import AsyncGenerator

from fastapi import Depends, Request
from sqlalchemy.ext.asyncio import AsyncSession

from vmk_data_collector.db.session import AsyncSessionLocal
from vmk_data_collector.services.ollama_client import OllamaClient
from vmk_data_collector.services.pipeline_factory import build_pipeline
from vmk_data_collector.services.property_pipeline import PropertyPipeline


async def get_db() -> AsyncGenerator[AsyncSession, None]:
    async with AsyncSessionLocal() as session:
        yield session


def get_ollama_client(request: Request) -> OllamaClient:
    return request.app.state.ollama_client


async def get_property_pipeline(
    request: Request,
    db: AsyncSession = Depends(get_db),
    client: OllamaClient = Depends(get_ollama_client),
) -> PropertyPipeline:
    return build_pipeline(
        session=db,
        ollama_client=client,
        active_jobs=getattr(request.app.state, "active_jobs", None),
    )
