# app/modules/customers/definition.py
"""
Customers module definition.

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

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


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

    return router


def _get_store_router():
    """Lazy import of store router to avoid circular imports."""
    from app.modules.customers.routes.store import router

    return router


def _get_metrics_provider():
    """Lazy import of metrics provider to avoid circular imports."""
    from app.modules.customers.services.customer_metrics import (
        customer_metrics_provider,
    )

    return customer_metrics_provider


def _get_feature_provider():
    """Lazy import of feature provider to avoid circular imports."""
    from app.modules.customers.services.customer_features import (
        customer_feature_provider,
    )

    return customer_feature_provider


# Customers module definition
customers_module = ModuleDefinition(
    code="customers",
    name="Customer Management",
    description="Customer database, profiles, addresses, and segmentation.",
    version="1.0.0",
    # Module-driven permissions
    permissions=[
        PermissionDefinition(
            id="customers.view",
            label_key="customers.permissions.customers_view",
            description_key="customers.permissions.customers_view_desc",
            category="customers",
        ),
        PermissionDefinition(
            id="customers.edit",
            label_key="customers.permissions.customers_edit",
            description_key="customers.permissions.customers_edit_desc",
            category="customers",
        ),
        PermissionDefinition(
            id="customers.delete",
            label_key="customers.permissions.customers_delete",
            description_key="customers.permissions.customers_delete_desc",
            category="customers",
        ),
        PermissionDefinition(
            id="customers.export",
            label_key="customers.permissions.customers_export",
            description_key="customers.permissions.customers_export_desc",
            category="customers",
        ),
    ],
    features=[
        "customer_view",  # View customer profiles
        "customer_export",  # Export customer data
        "customer_profiles",  # Detailed customer profiles
        "customer_segmentation",  # Customer tagging and segments
        "customer_addresses",  # Address management
        "customer_authentication",  # Customer login/registration
    ],
    menu_items={
        FrontendType.ADMIN: [
            "customers",  # Platform-wide customer view
        ],
        FrontendType.STORE: [
            "customers",  # Store customer list
        ],
    },
    # New module-driven menu definitions
    menus={
        FrontendType.ADMIN: [
            MenuSectionDefinition(
                id="userManagement",
                label_key="customers.menu.user_management",
                icon="user-group",
                order=10,
                items=[
                    MenuItemDefinition(
                        id="customers",
                        label_key="customers.menu.customers",
                        icon="user-group",
                        route="/admin/customers",
                        order=40,
                    ),
                ],
            ),
        ],
        FrontendType.STORE: [
            MenuSectionDefinition(
                id="customers",
                label_key="customers.menu.customers_section",
                icon="user-group",
                order=30,
                items=[
                    MenuItemDefinition(
                        id="customers",
                        label_key="customers.menu.all_customers",
                        icon="user-group",
                        route="/store/{store_code}/customers",
                        order=10,
                        requires_permission="customers.view",
                    ),
                ],
            ),
        ],
        FrontendType.STOREFRONT: [
            MenuSectionDefinition(
                id="account",
                label_key=None,
                order=10,
                items=[
                    MenuItemDefinition(
                        id="dashboard",
                        label_key="customers.storefront.account.dashboard",
                        icon="home",
                        route="account/dashboard",
                        order=10,
                    ),
                    MenuItemDefinition(
                        id="profile",
                        label_key="customers.storefront.account.profile",
                        icon="user",
                        route="account/profile",
                        order=20,
                    ),
                    MenuItemDefinition(
                        id="addresses",
                        label_key="customers.storefront.account.addresses",
                        icon="map-pin",
                        route="account/addresses",
                        order=30,
                    ),
                    MenuItemDefinition(
                        id="settings",
                        label_key="customers.storefront.account.settings",
                        icon="cog",
                        route="account/settings",
                        order=90,
                    ),
                ],
            ),
        ],
    },
    is_core=True,  # Customers is a core module - customer data is fundamental
    # =========================================================================
    # Self-Contained Module Configuration
    # =========================================================================
    is_self_contained=True,
    services_path="app.modules.customers.services",
    models_path="app.modules.customers.models",
    schemas_path="app.modules.customers.schemas",
    exceptions_path="app.modules.customers.exceptions",
    migrations_path="migrations",
    # Metrics provider for dashboard statistics
    metrics_provider=_get_metrics_provider,
    # Feature provider for feature flags
    feature_provider=_get_feature_provider,
)


def get_customers_module_with_routers() -> ModuleDefinition:
    """
    Get customers module with routers attached.

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


__all__ = ["customers_module", "get_customers_module_with_routers"]
