"""
API dependencies.

This module provides common dependencies for API endpoints.
"""

from typing import Optional
from fastapi import Depends, HTTPException, status, Header
from sqlalchemy.orm import Session

from app.database import get_db
from app.services.apiKeyService import ApiKeyService


async def get_api_key(
    x_api_key: Optional[str] = Header(None, description="API Key for authentication"),
    db: Session = Depends(get_db)
) -> int:
    """
    Dependency to validate API key from header.
    
    Args:
        x_api_key: API key from X-API-Key header
        db: Database session
    
    Returns:
        User ID associated with valid API key
    
    Raises:
        401: If API key is missing or invalid
    
    Example:
        from fastapi import Depends, APIRouter
        
        @router.get("/protected")
        async def protected_endpoint(user_id: int = Depends(get_api_key)):
            return {"user_id": user_id}
    """
    if not x_api_key:
        raise HTTPException(
            status_code=status.HTTP_401_UNAUTHORIZED,
            detail={
                "code": "MISSING_API_KEY",
                "message": "X-API-Key header is required for this endpoint"
            }
        )
    
    service = ApiKeyService(db)
    api_key_record = service.validate_api_key(x_api_key)
    
    if not api_key_record:
        raise HTTPException(
            status_code=status.HTTP_401_UNAUTHORIZED,
            detail={
                "code": "INVALID_API_KEY",
                "message": "Invalid API key"
            }
        )
    
    return api_key_record.user_id


async def get_api_key_optional(
    x_api_key: Optional[str] = Header(None, description="Optional API Key for authentication"),
    db: Session = Depends(get_db)
) -> Optional[int]:
    """
    Optional dependency to validate API key from header.
    
    Args:
        x_api_key: API key from X-API-Key header (optional)
        db: Database session
    
    Returns:
        User ID if API key is valid, None otherwise
    
    Example:
        from fastapi import Depends, APIRouter
        
        @router.get("/semi-public")
        async def semi_public_endpoint(user_id: Optional[int] = Depends(get_api_key_optional)):
            if user_id:
                return {"message": "Authenticated", "user_id": user_id}
            return {"message": "Unauthenticated"}
    """
    if not x_api_key:
        return None
    
    service = ApiKeyService(db)
    api_key_record = service.validate_api_key(x_api_key)
    
    if not api_key_record:
        return None
    
    return api_key_record.user_id
