from simorgh.apps.modules.registry import (
    CapabilitySpec,
    FeatureFlagSpec,
    FeatureSpec,
    ModuleManifest,
    register_module,
)

register_module(
    ModuleManifest(
        name="approval_engine",
        version=1,
        label_key="approval_engine.module_label",
        domain="platform",
        description="Approval Engine — generic approval management for all modules including single-step, multi-step, sequential, parallel, and conditional approvals",
        capabilities=(
            CapabilitySpec(slug="workflows", label_key="approval_engine.capabilities.workflows",
                          description="Approval workflows and chains", icon="flow"),
        ),
        features=(
            FeatureSpec(
                code="workflows.approval_management",
                label_key="approval_engine.features.approval_management",
                scope="tenant",
                default_enabled=True,
                description="Create and manage approval requests with full workflow",
            ),
            FeatureSpec(
                code="workflows.approval_matrix",
                label_key="approval_engine.features.approval_matrix",
                scope="tenant",
                default_enabled=True,
                description="Define reusable approval matrices for entity types",
            ),
            FeatureSpec(
                code="workflows.approval_chain",
                label_key="approval_engine.features.approval_chain",
                scope="tenant",
                default_enabled=True,
                description="Multi-step sequential and parallel approval chains",
            ),
            FeatureSpec(
                code="workflows.approval_delegation",
                label_key="approval_engine.features.approval_delegation",
                scope="tenant",
                default_enabled=True,
                description="Delegate approval decisions to other users",
            ),
        ),
        feature_flags=(
            FeatureFlagSpec(
                name="allow_confidential_approvals",
                label_key="approval_engine.ff.allow_confidential_approvals",
                default=False,
                scope="tenant",
            ),
            FeatureFlagSpec(
                name="allow_majority_voting",
                label_key="approval_engine.ff.allow_majority_voting",
                default=False,
                scope="tenant",
            ),
        ),
        permissions=(
            "approval_engine.request.view",
            "approval_engine.request.create",
            "approval_engine.request.update",
            "approval_engine.request.delete",
            "approval_engine.request.approve",
            "approval_engine.request.reject",
            "approval_engine.request.cancel",
            "approval_engine.request.delegate",
            "approval_engine.matrix.view",
            "approval_engine.matrix.create",
            "approval_engine.matrix.update",
            "approval_engine.matrix.delete",
        ),
        events=(
            "approval.requested",
            "approval.approved",
            "approval.rejected",
            "approval.returned",
            "approval.expired",
            "approval.cancelled",
            "approval.step_decided",
        ),
    )
)
