# app/modules/cart/definition.py
"""
Cart module definition.

This module provides shopping cart functionality for customer storefronts.
It is session-based and does not require customer authentication.
"""

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

# =============================================================================
# Router Lazy Imports
# =============================================================================


def _get_storefront_router():
    """Lazy import of storefront router to avoid circular imports."""
    from app.modules.cart.routes.api.storefront import router

    return router


# Cart module definition
cart_module = ModuleDefinition(
    code="cart",
    name="Shopping Cart",
    description="Session-based shopping cart for storefronts",
    version="1.0.0",
    is_self_contained=True,
    requires=["inventory", "catalog"],  # Checks inventory availability and references Product model
    migrations_path="migrations",
    features=[
        "cart_management",  # Basic cart CRUD operations
        "cart_persistence",  # Session and database persistence
        "cart_item_operations",  # Add, update, remove items
        "shipping_calculation",  # Calculate shipping for cart
        "promotion_application",  # Apply discounts and promotions
    ],
    # Note: Cart is primarily session-based storefront functionality.
    # These permissions are for admin access to cart data/settings.
    permissions=[
        PermissionDefinition(
            id="cart.view",
            label_key="cart.permissions.view",
            description_key="cart.permissions.view_desc",
            category="cart",
        ),
        PermissionDefinition(
            id="cart.manage",
            label_key="cart.permissions.manage",
            description_key="cart.permissions.manage_desc",
            category="cart",
        ),
    ],
    # Cart is storefront-only - no admin/store menus needed
    menus={
        FrontendType.STOREFRONT: [
            MenuSectionDefinition(
                id="actions",
                label_key=None,
                order=10,
                items=[
                    MenuItemDefinition(
                        id="cart",
                        label_key="cart.storefront.actions.cart",
                        icon="shopping-cart",
                        route="cart",
                        order=20,
                        header_template="cart/storefront/partials/header-cart.html",
                    ),
                ],
            ),
        ],
    },
)


def get_cart_module_with_routers() -> ModuleDefinition:
    """
    Get cart module with routers attached.

    This function attaches the routers lazily to avoid circular imports
    during module initialization.
    """
    cart_module.storefront_router = _get_storefront_router()
    return cart_module


__all__ = ["cart_module", "get_cart_module_with_routers"]
