"""Install automatic Accredible issuance function for education-learning.

Revision ID: 164
Revises: 163
"""
from datetime import datetime, timezone

from alembic import op
import sqlalchemy as sa
from sqlalchemy.dialects import postgresql


revision = "164"
down_revision = "163"
branch_labels = None
depends_on = None

feature_packs = sa.table(
    "feature_packs",
    sa.column("slug", sa.String),
    sa.column("version", sa.String),
    sa.column("composition", postgresql.JSONB),
    sa.column("input_schema", postgresql.JSONB),
    sa.column("updated_at", sa.DateTime(timezone=True)),
)

COMPOSITION = {
    "entities": [],
    "requires": [],
    "connector_actions": ["accredible.create_credential"],
    "function_slugs": [
        {
            "library_slug": "education-accredible-issue",
            "project_slug": "education-accredible-issue",
            "trigger_config": {
                "event_type": "education.certificate_issued",
                "static_env_vars": {
                    "ACCREDIBLE_CONNECTION_ID": "$config.accredible_connection_id",
                },
            },
        },
    ],
}

INPUT_SCHEMA = {
    "type": "object",
    "properties": {
        "accredible_connection_id": {
            "type": "string",
            "description": "Project Accredible connector connection id for automatic certificate issuance.",
        },
    },
}


def upgrade() -> None:
    op.execute(
        sa.update(feature_packs)
        .where(feature_packs.c.slug == "education-learning")
        .values(
            version="1.1.0",
            composition=COMPOSITION,
            input_schema=INPUT_SCHEMA,
            updated_at=datetime.now(timezone.utc),
        )
    )


def downgrade() -> None:
    op.execute(
        sa.update(feature_packs)
        .where(feature_packs.c.slug == "education-learning")
        .values(
            version="1.0.0",
            composition={"entities": [], "requires": [], "function_slugs": []},
            input_schema={"type": "object", "properties": {}},
            updated_at=datetime.now(timezone.utc),
        )
    )
