from fastapi import FastAPI
from contextlib import asynccontextmanager
import logging
import asyncio
from .core.config import settings
from .services.search_service import SearchService
from .infrastructure.kafka_client import kafka_client
from .infrastructure.monitoring.service_monitor import ServiceMonitor

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

search_service = SearchService()
service_monitor = ServiceMonitor(settings.SERVICE_NAME, kafka_client)

@asynccontextmanager
async def lifespan(app: FastAPI):
    # Startup
    logger.info(f"Starting {settings.SERVICE_NAME}...")
    
    # Start Kafka client
    await kafka_client.start_consumer([settings.QUEUE_TOPIC])
    
    # Start monitoring
    await service_monitor.start_monitoring()
    
    # Start consuming messages
    asyncio.create_task(
        kafka_client.consume_messages(search_service.process_search_task)
    )
    
    logger.info(f"{settings.SERVICE_NAME} started")
    
    yield
    
    # Shutdown
    logger.info(f"Shutting down {settings.SERVICE_NAME}...")
    await kafka_client.stop()
    logger.info(f"{settings.SERVICE_NAME} stopped")

app = FastAPI(
    title=settings.SERVICE_NAME,
    version=settings.VERSION,
    lifespan=lifespan
)

@app.get("/")
async def root():
    return {"service": settings.SERVICE_NAME, "status": "running"}

@app.get("/health")
async def health_check():
    return {
        "status": "healthy",
        "service": settings.SERVICE_NAME,
        "processed_tasks": service_monitor.health_data["processed_tasks"],
        "failed_tasks": service_monitor.health_data["failed_tasks"],
        "uptime": service_monitor.health_data["uptime"].isoformat()
    }

@app.get("/metrics")
async def metrics():
    return service_monitor.health_data
