"""
Dependency injection for FastAPI
"""

import os
from fastapi import Depends
from typing import Optional

from utils.chroma_db import ChromaDBManager
from utils.async_task_manager import AsyncTaskManager
from utils.logger import app_logger
from utils.conversation_handler import conversation_handler
from utils.optimized_conversation_memory import optimized_conversation_memory
from crew.rag_crew import RAGCrew


# Singleton instances
_vector_db = None
_task_manager = None
_rag_crew = None


def get_access_token():
    """Get access token for API authentication"""
    return os.getenv("GEMINI_API_KEY")


def get_logger():
    """Get application logger"""
    return app_logger


def get_vector_db():
    """Get vector database instance"""
    global _vector_db
    if _vector_db is None:
        _vector_db = ChromaDBManager()
    return _vector_db


def get_task_manager():
    """Get async task manager instance"""
    global _task_manager
    if _task_manager is None:
        _task_manager = AsyncTaskManager()
    return _task_manager


def get_conversation_handler():
    """Get conversation handler instance"""
    return conversation_handler


def get_conversation_memory():
    """Get optimized conversation memory instance"""
    return optimized_conversation_memory


def get_rag_crew(
    vector_db=Depends(get_vector_db),
    task_manager=Depends(get_task_manager),
    logger=Depends(get_logger)
):
    """Get RAG crew instance"""
    global _rag_crew
    if _rag_crew is None:
        _rag_crew = RAGCrew(
            vector_db=vector_db,
            task_manager=task_manager,
            logger=logger
        )
    return _rag_crew


def get_default_collection():
    """Get default collection name from environment"""
    return os.getenv("RAG_COLLECTION", "mangoit_docs")
