"""add monitoring tables

Revision ID: 2026_05_28_add_monitoring_tables
Revises: 2026_05_28_drop_tool_configs_and_config_folders
Create Date: 2026-05-28

"""

from collections.abc import Sequence

from alembic import op
import sqlalchemy as sa

# revision identifiers, used by Alembic.
revision: str = "2026_05_28_add_monitoring_tables"
down_revision: str | None = "2026_05_28_drop_tool_configs_and_config_folders"
branch_labels: str | Sequence[str] | None = None
depends_on: str | Sequence[str] | None = None


def upgrade() -> None:
    op.create_table(
        "instance_events",
        sa.Column("id", sa.Uuid(), nullable=False),
        sa.Column(
            "instance_id",
            sa.Uuid(),
            nullable=False,
        ),
        sa.Column("event_type", sa.String(length=50), nullable=False),
        sa.Column("status", sa.String(length=50), nullable=True),
        sa.Column("message", sa.Text(), nullable=True),
        sa.Column("created_by", sa.Uuid(), nullable=True),
        sa.Column(
            "metadata",
            sa.JSON(),
            nullable=False,
            server_default="{}",
        ),
        sa.Column(
            "created_at",
            sa.DateTime(timezone=True),
            server_default=sa.func.now(),
            nullable=False,
        ),
        sa.ForeignKeyConstraint(
            ["instance_id"],
            ["tool_instances.id"],
            ondelete="CASCADE",
        ),
        sa.ForeignKeyConstraint(
            ["created_by"],
            ["users.id"],
            ondelete="SET NULL",
        ),
        sa.PrimaryKeyConstraint("id"),
    )
    op.create_index(
        "idx_instance_events_instance_id",
        "instance_events",
        ["instance_id"],
    )
    op.create_index(
        "idx_instance_events_created_at",
        "instance_events",
        ["created_at"],
        postgresql_using="btree",
    )
    op.create_index(
        "idx_instance_events_event_type",
        "instance_events",
        ["event_type"],
    )

    op.create_table(
        "health_checks",
        sa.Column("id", sa.Uuid(), nullable=False),
        sa.Column(
            "instance_id",
            sa.Uuid(),
            nullable=False,
        ),
        sa.Column("container_status", sa.String(length=50), nullable=True),
        sa.Column("container_healthy", sa.Boolean(), nullable=True),
        sa.Column("tunnel_healthy", sa.Boolean(), nullable=True),
        sa.Column("exit_code", sa.Integer(), nullable=True),
        sa.Column("probe_status", sa.String(length=50), nullable=True),
        sa.Column("probe_output", sa.Text(), nullable=True),
        sa.Column(
            "checked_at",
            sa.DateTime(timezone=True),
            server_default=sa.func.now(),
            nullable=False,
        ),
        sa.ForeignKeyConstraint(
            ["instance_id"],
            ["tool_instances.id"],
            ondelete="CASCADE",
        ),
        sa.PrimaryKeyConstraint("id"),
    )
    op.create_index(
        "idx_health_checks_instance_id",
        "health_checks",
        ["instance_id"],
    )
    op.create_index(
        "idx_health_checks_checked_at",
        "health_checks",
        ["checked_at"],
        postgresql_using="btree",
    )


def downgrade() -> None:
    op.drop_index("idx_health_checks_checked_at", table_name="health_checks")
    op.drop_index("idx_health_checks_instance_id", table_name="health_checks")
    op.drop_table("health_checks")
    op.drop_index("idx_instance_events_event_type", table_name="instance_events")
    op.drop_index("idx_instance_events_created_at", table_name="instance_events")
    op.drop_index("idx_instance_events_instance_id", table_name="instance_events")
    op.drop_table("instance_events")
