"""Seed the generic requirements and fulfillment feature pack.

Revision ID: 171
Revises: 170
"""
from uuid import uuid4

import sqlalchemy as sa
from alembic import op
from sqlalchemy.dialects.postgresql import JSONB, UUID, insert

revision = "171"
down_revision = "170"
branch_labels = None
depends_on = None

feature_packs = sa.table(
    "feature_packs",
    sa.column("id", UUID(as_uuid=True)),
    sa.column("slug", sa.String),
    sa.column("name", sa.String),
    sa.column("description", sa.Text),
    sa.column("version", sa.String),
    sa.column("tags", JSONB),
    sa.column("status", sa.String),
    sa.column("composition", JSONB),
    sa.column("input_schema", JSONB),
    sa.column("access_policy", JSONB),
)


def upgrade() -> None:
    op.get_bind().execute(
        insert(feature_packs).values(
            id=uuid4(),
            slug="requirements-fulfillment",
            name="Requirements and Fulfillment",
            description=(
                "Generic subject-scoped requirements with evidence submission and explicit "
                "review, rejection, and waiver transitions."
            ),
            version="1.0.0",
            tags=["requirements", "fulfillment", "evidence"],
            status="active",
            composition={
                "entities": [{
                    "entity_key": "requirement",
                    "name": "Requirement",
                    "plural_name": "Requirements",
                    "rls_enabled": False,
                    "owner_managed": False,
                    "schema": {"fields": [
                        {"key": "subject_entity_key", "name": "Subject entity", "type": "text", "required": True, "indexed": True},
                        {"key": "subject_record_id", "name": "Subject record", "type": "text", "required": True, "indexed": True},
                        {"key": "definition_key", "name": "Definition", "type": "text", "required": True, "indexed": True},
                        {"key": "label", "name": "Label", "type": "text", "required": True},
                        {"key": "status", "name": "Status", "type": "select", "required": True, "indexed": True, "options": ["required", "submitted", "approved", "rejected", "waived"]},
                        {"key": "evidence_entity_key", "name": "Evidence entity", "type": "text"},
                        {"key": "evidence_record_id", "name": "Evidence record", "type": "text"},
                        {"key": "review_reason", "name": "Review reason", "type": "text"},
                    ]},
                }],
                "function_slugs": [],
                "connector_actions": [],
                "requires": [{"kind": "primitive", "id": "data.entity"}],
            },
            input_schema={"type": "object", "properties": {}},
            access_policy={"minimum_plan": "free"},
        ).on_conflict_do_nothing(index_elements=["slug"])
    )


def downgrade() -> None:
    pass
