"""
Internal API for Recipes Service
Handles internal service-to-service operations
"""

from fastapi import APIRouter, Depends, HTTPException, Header
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy import select, func
from uuid import UUID
import structlog

from app.core.database import get_db
from app.core.config import settings
from app.models.recipes import Recipe, RecipeStatus

logger = structlog.get_logger()
router = APIRouter(prefix="/internal", tags=["internal"])


async def verify_internal_api_key(x_internal_api_key: str = Header(None)):
    """Verify internal API key for service-to-service communication"""
    required_key = settings.INTERNAL_API_KEY
    if x_internal_api_key != required_key:
        logger.warning("Unauthorized internal API access attempted")
        raise HTTPException(status_code=403, detail="Invalid internal API key")
    return True


@router.get("/count")
async def get_recipe_count(
    tenant_id: str,
    db: AsyncSession = Depends(get_db),
    _: bool = Depends(verify_internal_api_key)
):
    """
    Get count of recipes for onboarding status check.
    Counts DRAFT and ACTIVE recipes (excludes ARCHIVED/DISCONTINUED).
    Internal endpoint for tenant service.
    """
    try:
        count = await db.scalar(
            select(func.count()).select_from(Recipe)
            .where(
                Recipe.tenant_id == UUID(tenant_id),
                Recipe.status.in_([RecipeStatus.DRAFT, RecipeStatus.ACTIVE, RecipeStatus.TESTING])
            )
        )

        return {
            "count": count or 0,
            "tenant_id": tenant_id
        }

    except Exception as e:
        logger.error("Failed to get recipe count", tenant_id=tenant_id, error=str(e))
        raise HTTPException(status_code=500, detail=f"Failed to get recipe count: {str(e)}")
