# app/modules/monitoring/routes/api/admin_platform_health.py
"""
Platform health and capacity monitoring endpoints.

Provides:
- Overall platform health status
- Capacity metrics and thresholds
- Scaling recommendations
"""

import logging

from fastapi import APIRouter, Depends
from pydantic import BaseModel
from sqlalchemy.orm import Session

from app.api.deps import get_current_admin_api
from app.core.database import get_db
from app.modules.monitoring.services.platform_health_service import (
    platform_health_service,
)
from app.modules.tenancy.schemas.auth import UserContext

admin_platform_health_router = APIRouter(prefix="/platform")
logger = logging.getLogger(__name__)


# ============================================================================
# Schemas
# ============================================================================


class SystemMetrics(BaseModel):
    """System resource metrics."""

    cpu_percent: float
    memory_percent: float
    memory_used_gb: float
    memory_total_gb: float
    disk_percent: float
    disk_used_gb: float
    disk_total_gb: float


class DatabaseMetrics(BaseModel):
    """Database metrics."""

    size_mb: float
    products_count: int
    orders_count: int
    stores_count: int
    inventory_count: int


class ImageStorageMetrics(BaseModel):
    """Image storage metrics."""

    total_files: int
    total_size_mb: float
    total_size_gb: float
    max_files_per_dir: int
    products_estimated: int


class CapacityThreshold(BaseModel):
    """Capacity threshold status."""

    name: str
    current: float
    warning: float
    critical: float
    limit: float
    status: str  # ok, warning, critical
    percent_used: float


class ScalingRecommendation(BaseModel):
    """Scaling recommendation."""

    priority: str  # info, warning, critical
    title: str
    description: str
    action: str | None = None


class PlatformHealthResponse(BaseModel):
    """Complete platform health response."""

    timestamp: str
    overall_status: str  # healthy, degraded, critical
    system: SystemMetrics
    database: DatabaseMetrics
    image_storage: ImageStorageMetrics
    thresholds: list[CapacityThreshold]
    recommendations: list[ScalingRecommendation]
    infrastructure_tier: str
    next_tier_trigger: str | None = None


class CapacityMetricsResponse(BaseModel):
    """Capacity-focused metrics."""

    products_total: int
    products_by_store: dict[str, int]
    images_total: int
    storage_used_gb: float
    database_size_mb: float
    orders_this_month: int
    active_stores: int


# ============================================================================
# Endpoints
# ============================================================================


@admin_platform_health_router.get("/health", response_model=PlatformHealthResponse)
async def get_platform_health(
    db: Session = Depends(get_db),
    current_admin: UserContext = Depends(get_current_admin_api),
):
    """Get comprehensive platform health status.

    Returns system metrics, database stats, storage info, and recommendations.
    """
    health_data = platform_health_service.get_full_health_report(db)

    return PlatformHealthResponse(
        timestamp=health_data["timestamp"],
        overall_status=health_data["overall_status"],
        system=SystemMetrics(**health_data["system"]),
        database=DatabaseMetrics(**health_data["database"]),
        image_storage=ImageStorageMetrics(**health_data["image_storage"]),
        thresholds=[CapacityThreshold(**t) for t in health_data["thresholds"]],
        recommendations=[ScalingRecommendation(**r) for r in health_data["recommendations"]],
        infrastructure_tier=health_data["infrastructure_tier"],
        next_tier_trigger=health_data["next_tier_trigger"],
    )


@admin_platform_health_router.get("/capacity", response_model=CapacityMetricsResponse)
async def get_capacity_metrics(
    db: Session = Depends(get_db),
    current_admin: UserContext = Depends(get_current_admin_api),
):
    """Get capacity-focused metrics for planning."""
    metrics = platform_health_service.get_capacity_metrics(db)
    return CapacityMetricsResponse(**metrics)


@admin_platform_health_router.get("/subscription-capacity")
async def get_subscription_capacity(
    db: Session = Depends(get_db),
    current_admin: UserContext = Depends(get_current_admin_api),
):
    """
    Get subscription-based capacity metrics.

    Shows theoretical vs actual capacity based on all store subscriptions.
    """
    return platform_health_service.get_subscription_capacity(db)


@admin_platform_health_router.get("/trends")
async def get_growth_trends(
    days: int = 30,
    db: Session = Depends(get_db),
    current_admin: UserContext = Depends(get_current_admin_api),
):
    """
    Get growth trends over the specified period.

    Returns growth rates and projections for key metrics.
    """
    from app.modules.monitoring.services.capacity_forecast_service import (
        capacity_forecast_service,
    )

    return capacity_forecast_service.get_growth_trends(db, days=days)


@admin_platform_health_router.get("/recommendations")
async def get_scaling_recommendations(
    db: Session = Depends(get_db),
    current_admin: UserContext = Depends(get_current_admin_api),
):
    """
    Get scaling recommendations based on current capacity and growth.

    Returns prioritized list of recommendations.
    """
    from app.modules.monitoring.services.capacity_forecast_service import (
        capacity_forecast_service,
    )

    return capacity_forecast_service.get_scaling_recommendations(db)


@admin_platform_health_router.post("/snapshot")
async def capture_snapshot(
    db: Session = Depends(get_db),
    current_admin: UserContext = Depends(get_current_admin_api),
):
    """
    Manually capture a capacity snapshot.

    Normally run automatically by daily background job.
    """
    from app.modules.monitoring.services.capacity_forecast_service import (
        capacity_forecast_service,
    )

    snapshot = capacity_forecast_service.capture_daily_snapshot(db)
    db.commit()

    return {
        "id": snapshot.id,
        "snapshot_date": snapshot.snapshot_date.isoformat(),
        "total_stores": snapshot.total_stores,
        "total_products": snapshot.total_products,
        "message": "Snapshot captured successfully",
    }
