# app/modules/payments/definition.py
"""
Payments module definition.

Defines the payments module including its features, menu items,
and route configurations.

The payments module provides gateway abstractions that can be used by:
- billing module: For platform subscriptions and invoices
- orders module: For customer checkout payments

This separation allows:
1. Using payments standalone (e.g., one-time payments without subscriptions)
2. Billing without orders (platform subscription only)
3. Orders without billing (customer payments only)
"""

from app.modules.base import ModuleDefinition, PermissionDefinition
from app.modules.enums import FrontendType


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

    return router


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

    return router


# Payments module definition
payments_module = ModuleDefinition(
    code="payments",
    name="Payment Gateways",
    description=(
        "Core payment gateway integrations for Stripe, PayPal, and bank transfers. "
        "Provides payment processing, refunds, and payment method management. "
        "Required by billing module for subscription payments."
    ),
    version="1.0.0",
    features=[
        "payment_processing",  # Process payments
        "payment_refunds",  # Issue refunds
        "payment_methods",  # Store payment methods
        "stripe_gateway",  # Stripe integration
        "paypal_gateway",  # PayPal integration
        "bank_transfer",  # Bank transfer support
        "transaction_history",  # Transaction records
    ],
    # Module-driven permissions
    permissions=[
        PermissionDefinition(
            id="payments.view_gateways",
            label_key="payments.permissions.view_gateways",
            description_key="payments.permissions.view_gateways_desc",
            category="payments",
        ),
        PermissionDefinition(
            id="payments.manage_gateways",
            label_key="payments.permissions.manage_gateways",
            description_key="payments.permissions.manage_gateways_desc",
            category="payments",
        ),
        PermissionDefinition(
            id="payments.view_transactions",
            label_key="payments.permissions.view_transactions",
            description_key="payments.permissions.view_transactions_desc",
            category="payments",
        ),
    ],
    menu_items={
        FrontendType.ADMIN: [
            "payment-gateways",  # Configure payment gateways
        ],
        FrontendType.STORE: [
            "payment-methods",  # Manage stored payment methods
        ],
    },
    is_core=True,  # Core module - required for billing and subscription management
    is_internal=False,
    # =========================================================================
    # Self-Contained Module Configuration
    # =========================================================================
    is_self_contained=True,
    services_path="app.modules.payments.services",
    models_path="app.modules.payments.models",
    schemas_path="app.modules.payments.schemas",
    exceptions_path="app.modules.payments.exceptions",
)


def get_payments_module_with_routers() -> ModuleDefinition:
    """
    Get payments module with routers attached.

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


__all__ = ["payments_module", "get_payments_module_with_routers"]
