"""Application dependency factories."""

from __future__ import annotations

from functools import lru_cache

from app.agents.orchestrator import TaskOrchestrator
from app.core.settings import get_settings
from app.modules.core.application.embeddings import EmbeddingService
from app.modules.agents.application.llm_client import LLMClient
from app.modules.core.application.qdrant_store import QdrantStore


@lru_cache(maxsize=1)
def get_settings_cached():
    """Return a shared settings instance."""

    return get_settings()


@lru_cache(maxsize=1)
def get_llm_client() -> LLMClient:
    """Create a shared LLM client instance."""

    settings = get_settings_cached()
    return LLMClient(settings)


@lru_cache(maxsize=1)
def get_embedding_service() -> EmbeddingService:
    """Create a shared embedding service instance."""

    settings = get_settings_cached()
    return EmbeddingService(settings)


@lru_cache(maxsize=1)
def get_qdrant_store() -> QdrantStore:
    """Create a shared Qdrant store instance."""

    settings = get_settings_cached()
    return QdrantStore(
        settings=settings,
        embedding_service=get_embedding_service(),
    )


@lru_cache(maxsize=1)
def get_orchestrator() -> TaskOrchestrator:
    """Create the task orchestrator."""

    return TaskOrchestrator(
        llm_client=get_llm_client(),
        qdrant_store=get_qdrant_store(),
        embedding_service=get_embedding_service(),
    )
