# app/modules/monitoring/definition.py
"""
Monitoring module definition.

Defines the monitoring module including its features, menu items,
route configurations, and self-contained module settings.
"""

from app.modules.base import MenuItemDefinition, MenuSectionDefinition, ModuleDefinition
from app.modules.enums import FrontendType


def _get_admin_router():
    """Lazy import of admin router to avoid circular imports."""
    from app.modules.monitoring.routes.admin import router

    return router


def _get_audit_provider():
    """Lazy import of audit provider to avoid circular imports."""
    from app.modules.monitoring.services.audit_provider import audit_provider

    return audit_provider


# Monitoring module definition
monitoring_module = ModuleDefinition(
    code="monitoring",
    name="Platform Monitoring",
    description="Logs, background tasks, imports, system health, Flower, and Grafana integration.",
    version="1.0.0",
    features=[
        "application_logs",  # Log viewing
        "background_tasks",  # Task monitoring
        "import_jobs",  # Import job tracking
        "capacity_monitoring",  # System capacity
        "testing_hub",  # Test runner
        "code_quality",  # Code quality tools
        "flower_integration",  # Celery Flower link
        "grafana_integration",  # Grafana dashboard link
    ],
    menu_items={
        FrontendType.ADMIN: [
            "imports",  # Import jobs
            "background-tasks",  # Background tasks
            "logs",  # Application logs
            "platform-health",  # Platform health
            "testing",  # Testing hub
            "code-quality",  # Code quality
        ],
        FrontendType.STORE: [],  # No store menu items
    },
    # New module-driven menu definitions
    menus={
        FrontendType.ADMIN: [
            MenuSectionDefinition(
                id="platformHealth",
                label_key="monitoring.menu.platform_health",
                icon="chart-bar",
                order=75,
                is_super_admin_only=True,
                items=[
                    MenuItemDefinition(
                        id="platform-health",
                        label_key="monitoring.menu.capacity_monitor",
                        icon="chart-bar",
                        route="/admin/platform-health",
                        order=10,
                    ),
                    MenuItemDefinition(
                        id="testing",
                        label_key="monitoring.menu.testing_hub",
                        icon="beaker",
                        route="/admin/testing",
                        order=20,
                    ),
                    MenuItemDefinition(
                        id="code-quality",
                        label_key="monitoring.menu.code_quality",
                        icon="shield-check",
                        route="/admin/code-quality",
                        order=30,
                    ),
                ],
            ),
            MenuSectionDefinition(
                id="monitoring",
                label_key="monitoring.menu.platform_monitoring",
                icon="collection",
                order=80,
                is_super_admin_only=True,
                items=[
                    MenuItemDefinition(
                        id="imports",
                        label_key="monitoring.menu.import_jobs",
                        icon="cube",
                        route="/admin/imports",
                        order=10,
                    ),
                    MenuItemDefinition(
                        id="background-tasks",
                        label_key="monitoring.menu.background_tasks",
                        icon="collection",
                        route="/admin/background-tasks",
                        order=20,
                    ),
                    MenuItemDefinition(
                        id="logs",
                        label_key="monitoring.menu.application_logs",
                        icon="document-text",
                        route="/admin/logs",
                        order=30,
                    ),
                ],
            ),
        ],
    },
    is_core=False,
    is_internal=True,  # Internal module - admin-only, not customer-facing
    # =========================================================================
    # Audit Provider
    # =========================================================================
    audit_provider=_get_audit_provider,
    # =========================================================================
    # Self-Contained Module Configuration
    # =========================================================================
    is_self_contained=True,
    services_path="app.modules.monitoring.services",
    models_path="app.modules.monitoring.models",
    schemas_path="app.modules.monitoring.schemas",
    exceptions_path="app.modules.monitoring.exceptions",
)


def get_monitoring_module_with_routers() -> ModuleDefinition:
    """
    Get monitoring module with routers attached.

    This function attaches the routers lazily to avoid circular imports
    during module initialization.
    """
    monitoring_module.admin_router = _get_admin_router()
    return monitoring_module


__all__ = ["monitoring_module", "get_monitoring_module_with_routers"]
