"""Catalog Engine — AI semantic entity registration.

Registers catalog entities with the Semantic Search Engine so AI agents
can understand catalog structure, fields, and relationships.
"""

from __future__ import annotations

from simorgh.apps.ai.semantic import (
    EntitySpec,
    FieldSpec,
    RelationSpec,
    register_entity,
)


def register_all() -> None:
    """Register all catalog entities in the AI semantic registry."""

    # ── CatalogCategory ─────────────────────────────────────────────────

    register_entity(
        EntitySpec(
            key="catalog.category",
            label_key="catalog.category",
            description="Hierarchical category tree for catalog items. "
                        "Categories are typed (product, service, IT service, "
                        "HR service, procurement) and support nested subcategories.",
            fields=(
                FieldSpec(
                    name="name",
                    type="string",
                    label_key="catalog.category.fields.name",
                    required=True,
                    description="Category display name",
                ),
                FieldSpec(
                    name="slug",
                    type="string",
                    label_key="catalog.category.fields.slug",
                    required=True,
                    description="URL-friendly unique identifier per tenant",
                ),
                FieldSpec(
                    name="catalog_type",
                    type="string",
                    label_key="catalog.category.fields.catalog_type",
                    required=True,
                    description="Catalog type discriminator: product, service, "
                                "it_service, hr_service, procurement",
                ),
                FieldSpec(
                    name="description",
                    type="text",
                    label_key="catalog.category.fields.description",
                    description="Optional category description",
                ),
                FieldSpec(
                    name="icon",
                    type="string",
                    label_key="catalog.category.fields.icon",
                    description="Icon identifier for UI display",
                ),
                FieldSpec(
                    name="is_active",
                    type="boolean",
                    label_key="catalog.category.fields.is_active",
                    description="Whether the category is active and visible",
                ),
            ),
            relations=(
                RelationSpec(
                    name="parent",
                    target="catalog.category",
                    kind="many_to_one",
                    description="Parent category for hierarchical nesting",
                ),
                RelationSpec(
                    name="items",
                    target="catalog.item",
                    kind="one_to_many",
                    description="Catalog items belonging to this category",
                ),
            ),
            actions=(
                "catalog.category.view",
                "catalog.category.manage",
            ),
        )
    )

    # ── CatalogItem ─────────────────────────────────────────────────────

    register_entity(
        EntitySpec(
            key="catalog.item",
            label_key="catalog.item",
            description="Unified catalog entity for products, services, "
                        "IT services, HR services, and procurement items. "
                        "Metadata and discoverability only — no commerce logic. "
                        "Follows Draft→Review→Published→Retired lifecycle.",
            fields=(
                FieldSpec(
                    name="name",
                    type="string",
                    label_key="catalog.item.fields.name",
                    required=True,
                    description="Display name of the catalog item",
                ),
                FieldSpec(
                    name="slug",
                    type="string",
                    label_key="catalog.item.fields.slug",
                    required=True,
                    description="URL-friendly unique identifier per tenant",
                ),
                FieldSpec(
                    name="catalog_type",
                    type="string",
                    label_key="catalog.item.fields.catalog_type",
                    required=True,
                    description="Catalog type discriminator: product, service, "
                                "it_service, hr_service, procurement",
                ),
                FieldSpec(
                    name="description",
                    type="text",
                    label_key="catalog.item.fields.description",
                    description="Full rich-text description",
                ),
                FieldSpec(
                    name="short_description",
                    type="string",
                    label_key="catalog.item.fields.short_description",
                    description="Brief summary for list views",
                ),
                FieldSpec(
                    name="status",
                    type="string",
                    label_key="catalog.item.fields.status",
                    description="Lifecycle status: draft, review, published, retired",
                ),
                FieldSpec(
                    name="published_at",
                    type="datetime",
                    label_key="catalog.item.fields.published_at",
                    description="Timestamp when the item was last published",
                ),
                FieldSpec(
                    name="ai_description",
                    type="text",
                    label_key="catalog.item.fields.ai_description",
                    description="AI-generated or AI-enriched description for "
                                "semantic search and recommendations",
                ),
                FieldSpec(
                    name="ai_semantic_type",
                    type="string",
                    label_key="catalog.item.fields.ai_semantic_type",
                    description="AI semantic classification label",
                ),
            ),
            relations=(
                RelationSpec(
                    name="category",
                    target="catalog.category",
                    kind="many_to_one",
                    description="Category this item belongs to",
                ),
                RelationSpec(
                    name="owner",
                    target="accounts.user",
                    kind="many_to_one",
                    description="User responsible for this catalog item",
                ),
            ),
            actions=(
                "catalog.item.view",
                "catalog.item.create",
                "catalog.item.update",
                "catalog.item.publish",
                "catalog.item.delete",
            ),
        )
    )
