"""Add wp_mutation_actions table for per-operation mutation tracking.

Each approved AssistantActionSession produces one WpMutationAction row per
operation. Records sequence, action name, payload, before/after hashes, and
result for rollback tracing.

Revision ID: 077
Revises: 076
"""

from typing import Sequence, Union

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

revision: str = "077"
down_revision: Union[str, None] = "076"
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None


def upgrade() -> None:
    op.create_table(
        "wp_mutation_actions",
        sa.Column("id", UUID(as_uuid=True), primary_key=True),
        sa.Column(
            "action_session_id",
            UUID(as_uuid=True),
            sa.ForeignKey("assistant_action_sessions.id", ondelete="CASCADE"),
            nullable=False,
        ),
        sa.Column(
            "installation_id",
            UUID(as_uuid=True),
            sa.ForeignKey("external_admin_installations.id", ondelete="CASCADE"),
            nullable=False,
        ),
        sa.Column(
            "project_id",
            UUID(as_uuid=True),
            sa.ForeignKey("projects.id", ondelete="CASCADE"),
            nullable=False,
        ),
        sa.Column("sequence_number", sa.Integer, nullable=False),
        sa.Column("action", sa.String(80), nullable=False),
        sa.Column("description", sa.Text, nullable=False),
        sa.Column("payload", JSONB, nullable=False, server_default="{}"),
        sa.Column("status", sa.String(20), nullable=False, server_default="pending"),
        sa.Column("before_hash", sa.String(64), nullable=True),
        sa.Column("after_hash", sa.String(64), nullable=True),
        sa.Column("result_json", JSONB, nullable=True),
        sa.Column("error", sa.Text, nullable=True),
        sa.Column("executed_at", sa.DateTime(timezone=True), nullable=True),
        sa.Column("created_at", sa.DateTime(timezone=True), server_default=sa.text("now()"), nullable=False),
        sa.Column("updated_at", sa.DateTime(timezone=True), server_default=sa.text("now()"), nullable=False),
    )
    op.create_index("ix_wp_mutation_actions_session", "wp_mutation_actions", ["action_session_id"])
    op.create_index("ix_wp_mutation_actions_installation", "wp_mutation_actions", ["installation_id"])
    op.create_index("ix_wp_mutation_actions_status", "wp_mutation_actions", ["status"])
    op.create_index(
        "ix_wp_mutation_actions_session_seq",
        "wp_mutation_actions",
        ["action_session_id", "sequence_number"],
    )


def downgrade() -> None:
    op.drop_table("wp_mutation_actions")
