"""FastAPI dependencies for Cloud → Core internal API."""
from __future__ import annotations

from typing import Annotated, Optional

from fastapi import Depends, Header, HTTPException
from sqlalchemy.ext.asyncio import AsyncSession

from src.config import get_settings
from src.core.database import get_db
from src.domain.billing.repository import SubscriptionRepository, UsageLedgerRepository
from src.domain.cloud.service import CloudInternalService
from src.domain.connectors.repository import ConnectorRepository
from src.domain.admin.repository import SubscriptionPlanRepository
from src.domain.billing.plan_quota_service import PlanQuotaService
from src.domain.email_domains.repository import EmailDomainRepository, EmailQuotaRepository
from src.domain.email_domains.service import EmailQuotaService
from src.domain.voice.repository import VoiceRepository
from src.domain.livechat.repository import LivechatRepository
from src.domain.runtime_ai.repository import RuntimeAiLedgerRepository
from src.domain.runtime_ai.wallet import RuntimeAiWallet
from src.domain.cloud_credits.service import CloudCreditService
from src.domain.hosting.public_serving_gate import HostingPublicServingGate
from src.domain.project_storage.repository import ProjectStorageUsageRepository
from src.domain.projects.repository import ProjectRepository, ProjectSettingsRepository
from src.domain.workspaces.repository import WorkspaceRepository


async def require_cloud_internal_token(
    authorization: Annotated[Optional[str], Header()] = None,
) -> None:
    settings = get_settings()
    if not (settings.cloud_internal_token or "").strip():
        raise HTTPException(status_code=503, detail="Cloud internal API is not configured")
    if not authorization or not authorization.startswith("Bearer "):
        raise HTTPException(status_code=401, detail="Missing bearer token")
    token = authorization[7:].strip()
    if token != settings.cloud_internal_token:
        raise HTTPException(status_code=401, detail="Invalid token")


async def get_cloud_internal_service(
    db: AsyncSession = Depends(get_db),
) -> CloudInternalService:
    return CloudInternalService(
        db=db,
        project_repo=ProjectRepository(db),
        workspace_repo=WorkspaceRepository(db),
        settings_repo=ProjectSettingsRepository(db),
        subscription_repo=SubscriptionRepository(db),
        usage_ledger=UsageLedgerRepository(db),
        storage_usage_repo=ProjectStorageUsageRepository(db),
        connector_repo=ConnectorRepository(db),
        voice_repo=VoiceRepository(db),
        livechat_repo=LivechatRepository(db),
        runtime_wallet=RuntimeAiWallet(RuntimeAiLedgerRepository(db)),
        cloud_credits=CloudCreditService(db=db, serving_gate=HostingPublicServingGate()),
        email_domain_repo=EmailDomainRepository(db),
        email_quota_service=EmailQuotaService(
            EmailQuotaRepository(db),
            PlanQuotaService(WorkspaceRepository(db), SubscriptionRepository(db), SubscriptionPlanRepository(db)),
            SubscriptionRepository(db),
        ),
    )
