from __future__ import annotations

from alembic import op
import sqlalchemy as sa

revision = "0002_joomla_integration"
down_revision = "0001_initial_schema"
branch_labels = None
depends_on = None


def upgrade() -> None:
    with op.batch_alter_table("customers") as batch_op:
        batch_op.add_column(sa.Column("external_source", sa.String(length=80), nullable=True))
        batch_op.add_column(sa.Column("external_customer_id", sa.String(length=200), nullable=True))
        batch_op.create_index("ix_customers_external_source", ["external_source"])
        batch_op.create_index("ix_customers_external_customer_id", ["external_customer_id"])
        batch_op.create_unique_constraint(
            "uq_customer_external_identity",
            ["external_source", "external_customer_id"],
        )

    op.create_table(
        "integration_idempotency_records",
        sa.Column("id", sa.Uuid(), primary_key=True, nullable=False),
        sa.Column("source", sa.String(length=80), nullable=False),
        sa.Column("idempotency_key", sa.String(length=120), nullable=False),
        sa.Column("operation", sa.String(length=120), nullable=False),
        sa.Column("licence_id", sa.Uuid(), sa.ForeignKey("licences.id"), nullable=True),
        sa.Column("response_json", sa.JSON(), nullable=False),
        sa.Column("created_at", sa.DateTime(timezone=True), nullable=False),
        sa.Column("updated_at", sa.DateTime(timezone=True), nullable=False),
        sa.UniqueConstraint("source", "idempotency_key", name="uq_integration_idempotency_source_key"),
    )
    op.create_index("ix_integration_idempotency_records_source", "integration_idempotency_records", ["source"])


def downgrade() -> None:
    op.drop_table("integration_idempotency_records")
    with op.batch_alter_table("customers") as batch_op:
        batch_op.drop_constraint("uq_customer_external_identity", type_="unique")
        batch_op.drop_index("ix_customers_external_customer_id")
        batch_op.drop_index("ix_customers_external_source")
        batch_op.drop_column("external_customer_id")
        batch_op.drop_column("external_source")
