"""Add baseline registry tables: store, category, attribute, attribute_option, baseline_sync_runs.

Revision ID: 0018_add_baseline_registry_tables
Revises: 0017_add_magento_category_cache
Create Date: 2026-03-04
"""

from alembic import op
import sqlalchemy as sa

revision = "0018_add_baseline_registry_tables"
down_revision = "0017_add_magento_category_cache"
branch_labels = None
depends_on = None


def upgrade() -> None:
    op.create_table(
        "magento_store_registry",
        sa.Column("id", sa.Integer(), primary_key=True, autoincrement=True),
        sa.Column("connection_id", sa.Integer(), sa.ForeignKey("magento_connections.id"), nullable=False),
        sa.Column("website_id", sa.Integer(), nullable=False),
        sa.Column("website_code", sa.Text(), nullable=True),
        sa.Column("website_name", sa.Text(), nullable=True),
        sa.Column("store_group_id", sa.Integer(), nullable=True),
        sa.Column("store_group_name", sa.Text(), nullable=True),
        sa.Column("store_id", sa.Integer(), nullable=True),
        sa.Column("store_code", sa.Text(), nullable=True),
        sa.Column("store_name", sa.Text(), nullable=True),
        sa.Column("is_default", sa.Boolean(), nullable=False, server_default="false"),
        sa.Column("raw_json", sa.JSON(), nullable=True),
        sa.Column("fetched_at", sa.DateTime(timezone=True), nullable=False),
        sa.UniqueConstraint("connection_id", "website_id", "store_id", name="uq_store_registry_conn_web_store"),
    )
    op.create_index("ix_store_registry_conn", "magento_store_registry", ["connection_id"])

    op.create_table(
        "magento_category_registry",
        sa.Column("id", sa.Integer(), primary_key=True, autoincrement=True),
        sa.Column("connection_id", sa.Integer(), sa.ForeignKey("magento_connections.id"), nullable=False),
        sa.Column("category_id", sa.Integer(), nullable=False),
        sa.Column("parent_id", sa.Integer(), nullable=True),
        sa.Column("name", sa.Text(), nullable=False),
        sa.Column("path", sa.Text(), nullable=False),
        sa.Column("path_names", sa.Text(), nullable=True),
        sa.Column("level", sa.Integer(), nullable=False, server_default="0"),
        sa.Column("is_active", sa.Boolean(), nullable=False, server_default="true"),
        sa.Column("fetched_at", sa.DateTime(timezone=True), nullable=False),
        sa.UniqueConstraint("connection_id", "category_id", name="uq_category_registry_conn_catid"),
    )
    op.create_index("ix_category_registry_conn_path_names", "magento_category_registry", ["connection_id", "path_names"])
    op.create_index("ix_category_registry_conn_name", "magento_category_registry", ["connection_id", "name"])

    op.create_table(
        "magento_attribute_registry",
        sa.Column("id", sa.Integer(), primary_key=True, autoincrement=True),
        sa.Column("connection_id", sa.Integer(), sa.ForeignKey("magento_connections.id"), nullable=False),
        sa.Column("attribute_code", sa.Text(), nullable=False),
        sa.Column("attribute_id", sa.Integer(), nullable=False),
        sa.Column("frontend_label", sa.Text(), nullable=True),
        sa.Column("frontend_input", sa.Text(), nullable=True),
        sa.Column("backend_type", sa.Text(), nullable=True),
        sa.Column("is_user_defined", sa.Boolean(), nullable=True),
        sa.Column("fetched_at", sa.DateTime(timezone=True), nullable=False),
        sa.UniqueConstraint("connection_id", "attribute_code", name="uq_attribute_registry_conn_code"),
    )

    op.create_table(
        "magento_attribute_option_registry",
        sa.Column("id", sa.Integer(), primary_key=True, autoincrement=True),
        sa.Column("connection_id", sa.Integer(), sa.ForeignKey("magento_connections.id"), nullable=False),
        sa.Column("attribute_code", sa.Text(), nullable=False),
        sa.Column("option_label", sa.Text(), nullable=False),
        sa.Column("option_label_norm", sa.Text(), nullable=False),
        sa.Column("value_index", sa.Integer(), nullable=False),
        sa.Column("fetched_at", sa.DateTime(timezone=True), nullable=False),
        sa.UniqueConstraint("connection_id", "attribute_code", "option_label_norm", name="uq_attr_opt_registry_conn_code_norm"),
    )
    op.create_index("ix_attr_opt_registry_conn_code", "magento_attribute_option_registry", ["connection_id", "attribute_code"])

    op.create_table(
        "magento_baseline_sync_runs",
        sa.Column("id", sa.Integer(), primary_key=True, autoincrement=True),
        sa.Column("connection_id", sa.Integer(), sa.ForeignKey("magento_connections.id"), nullable=False),
        sa.Column("started_at", sa.DateTime(timezone=True), nullable=False),
        sa.Column("finished_at", sa.DateTime(timezone=True), nullable=True),
        sa.Column("status", sa.Text(), nullable=False, server_default="running"),
        sa.Column("error", sa.Text(), nullable=True),
        sa.Column("fetched_counts", sa.JSON(), nullable=True),
    )
    op.create_index("ix_baseline_runs_conn_status", "magento_baseline_sync_runs", ["connection_id", "status"])


def downgrade() -> None:
    op.drop_table("magento_baseline_sync_runs")
    op.drop_table("magento_attribute_option_registry")
    op.drop_table("magento_attribute_registry")
    op.drop_table("magento_category_registry")
    op.drop_table("magento_store_registry")
