"""drop_looptalk_tables

Revision ID: 4c1f1e3e8ef2
Revises: 6499c608d0f6
Create Date: 2026-05-16 14:46:18.296517

"""

from typing import Sequence, Union

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

# revision identifiers, used by Alembic.
revision: str = "4c1f1e3e8ef2"
down_revision: Union[str, None] = "6499c608d0f6"
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None


def upgrade() -> None:
    # Drop child table first so its FK to looptalk_test_sessions is removed before the parent is dropped.
    op.drop_index(
        op.f("ix_looptalk_conversations_session_id"),
        table_name="looptalk_conversations",
    )
    op.drop_table("looptalk_conversations")
    op.drop_index(
        op.f("ix_looptalk_test_sessions_group_id"), table_name="looptalk_test_sessions"
    )
    op.drop_index(
        op.f("ix_looptalk_test_sessions_load_test_group_id"),
        table_name="looptalk_test_sessions",
    )
    op.drop_index(
        op.f("ix_looptalk_test_sessions_org_id"), table_name="looptalk_test_sessions"
    )
    op.drop_index(
        op.f("ix_looptalk_test_sessions_status"), table_name="looptalk_test_sessions"
    )
    op.drop_table("looptalk_test_sessions")
    sa.Enum(
        "pending", "running", "completed", "failed", name="test_session_status"
    ).drop(op.get_bind())


def downgrade() -> None:
    # ### commands auto generated by Alembic - please adjust! ###
    sa.Enum(
        "pending", "running", "completed", "failed", name="test_session_status"
    ).create(op.get_bind())
    op.create_table(
        "looptalk_conversations",
        sa.Column("id", sa.INTEGER(), autoincrement=True, nullable=False),
        sa.Column("test_session_id", sa.INTEGER(), autoincrement=False, nullable=False),
        sa.Column("duration_seconds", sa.INTEGER(), autoincrement=False, nullable=True),
        sa.Column(
            "actor_recording_url", sa.VARCHAR(), autoincrement=False, nullable=True
        ),
        sa.Column(
            "adversary_recording_url", sa.VARCHAR(), autoincrement=False, nullable=True
        ),
        sa.Column(
            "combined_recording_url", sa.VARCHAR(), autoincrement=False, nullable=True
        ),
        sa.Column(
            "transcript",
            postgresql.JSON(astext_type=sa.Text()),
            autoincrement=False,
            nullable=False,
        ),
        sa.Column(
            "metrics",
            postgresql.JSON(astext_type=sa.Text()),
            autoincrement=False,
            nullable=False,
        ),
        sa.Column(
            "created_at",
            postgresql.TIMESTAMP(timezone=True),
            autoincrement=False,
            nullable=True,
        ),
        sa.Column(
            "ended_at",
            postgresql.TIMESTAMP(timezone=True),
            autoincrement=False,
            nullable=True,
        ),
        sa.ForeignKeyConstraint(
            ["test_session_id"],
            ["looptalk_test_sessions.id"],
            name=op.f("looptalk_conversations_test_session_id_fkey"),
        ),
        sa.PrimaryKeyConstraint("id", name=op.f("looptalk_conversations_pkey")),
    )
    op.create_index(
        op.f("ix_looptalk_conversations_session_id"),
        "looptalk_conversations",
        ["test_session_id"],
        unique=False,
    )
    op.create_table(
        "looptalk_test_sessions",
        sa.Column("id", sa.INTEGER(), autoincrement=True, nullable=False),
        sa.Column("organization_id", sa.INTEGER(), autoincrement=False, nullable=False),
        sa.Column("name", sa.VARCHAR(), autoincrement=False, nullable=False),
        sa.Column(
            "status",
            postgresql.ENUM(
                "pending",
                "running",
                "completed",
                "failed",
                name="test_session_status",
                create_type=False,
            ),
            autoincrement=False,
            nullable=False,
        ),
        sa.Column(
            "actor_workflow_id", sa.INTEGER(), autoincrement=False, nullable=False
        ),
        sa.Column(
            "adversary_workflow_id", sa.INTEGER(), autoincrement=False, nullable=False
        ),
        sa.Column(
            "load_test_group_id", sa.VARCHAR(), autoincrement=False, nullable=True
        ),
        sa.Column("test_index", sa.INTEGER(), autoincrement=False, nullable=True),
        sa.Column(
            "config",
            postgresql.JSON(astext_type=sa.Text()),
            autoincrement=False,
            nullable=False,
        ),
        sa.Column(
            "results",
            postgresql.JSON(astext_type=sa.Text()),
            autoincrement=False,
            nullable=False,
        ),
        sa.Column("error", sa.VARCHAR(), autoincrement=False, nullable=True),
        sa.Column(
            "created_at",
            postgresql.TIMESTAMP(timezone=True),
            autoincrement=False,
            nullable=True,
        ),
        sa.Column(
            "started_at",
            postgresql.TIMESTAMP(timezone=True),
            autoincrement=False,
            nullable=True,
        ),
        sa.Column(
            "completed_at",
            postgresql.TIMESTAMP(timezone=True),
            autoincrement=False,
            nullable=True,
        ),
        sa.ForeignKeyConstraint(
            ["actor_workflow_id"],
            ["workflows.id"],
            name=op.f("looptalk_test_sessions_actor_workflow_id_fkey"),
        ),
        sa.ForeignKeyConstraint(
            ["adversary_workflow_id"],
            ["workflows.id"],
            name=op.f("looptalk_test_sessions_adversary_workflow_id_fkey"),
        ),
        sa.ForeignKeyConstraint(
            ["organization_id"],
            ["organizations.id"],
            name=op.f("looptalk_test_sessions_organization_id_fkey"),
        ),
        sa.PrimaryKeyConstraint("id", name=op.f("looptalk_test_sessions_pkey")),
    )
    op.create_index(
        op.f("ix_looptalk_test_sessions_status"),
        "looptalk_test_sessions",
        ["status"],
        unique=False,
    )
    op.create_index(
        op.f("ix_looptalk_test_sessions_org_id"),
        "looptalk_test_sessions",
        ["organization_id"],
        unique=False,
    )
    op.create_index(
        op.f("ix_looptalk_test_sessions_load_test_group_id"),
        "looptalk_test_sessions",
        ["load_test_group_id"],
        unique=False,
    )
    op.create_index(
        op.f("ix_looptalk_test_sessions_group_id"),
        "looptalk_test_sessions",
        ["load_test_group_id"],
        unique=False,
    )
    # ### end Alembic commands ###
