"""hwadm006 feature control tables and seed data

Revision ID: hwadm006_feature_control
Revises: 784f6c1c225a
Create Date: 2026-05-05 00:00:00.000000

"""
from typing import Sequence, Union
from alembic import op
import sqlalchemy as sa
from sqlalchemy.dialects.postgresql import UUID
import uuid


revision: str = 'hwadm006_feature_control'
down_revision: Union[str, Sequence[str], None] = '4d27ce1d757d'
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None


FEATURE_FLAGS = [
    # slug, name, description, is_default
    ("virtual_terminal", "Virtual Terminal", "Accept payments via virtual terminal", True),
    ("accounts", "Accounts", "Manage customer accounts", True),
    ("items", "Items", "Manage products and items catalog", True),
    ("dashboard", "Dashboard", "Access the main dashboard", True),
    ("invoices", "Invoices", "Create and manage invoices", True),
    ("transactions", "Transactions", "View and manage transactions", True),
    ("settings_basic", "Basic Settings", "Access basic portal settings", True),
    # Controllable
    ("checkouts", "Checkouts", "Hosted checkout pages and checkout links", False),
    ("subscriptions", "Subscriptions", "Recurring billing and subscription management", False),
    ("reports_full", "Full Reports", "Access to full reports suite (activity, tender, methods)", False),
    ("hpp", "Hosted Payment Page", "Hosted payment page configuration and links", False),
    ("cart_plugin", "Cart Plugin", "Shopping cart plugin and integrations", False),
    ("developer_api", "Developer API", "API key management and developer tools", False),
    ("authorizations", "Authorizations", "Authorization management (checkbox, signature, SMS)", False),
    ("discounts", "Discounts", "Discount and promo code management", False),
    ("tax", "Tax", "Tax configuration and TaxJar integration", False),
]


def upgrade() -> None:
    op.create_table(
        "feature_flags",
        sa.Column("slug", sa.String(100), primary_key=True),
        sa.Column("name", sa.String(255), nullable=False),
        sa.Column("description", sa.Text(), nullable=True),
        sa.Column("is_default", sa.Boolean(), nullable=False, server_default=sa.false()),
        sa.Column("is_active", sa.Boolean(), nullable=False, server_default=sa.true(), index=True),
    )

    op.create_table(
        "feature_plans",
        sa.Column("id", sa.Integer(), primary_key=True, autoincrement=True),
        sa.Column("uuid", UUID(as_uuid=False), nullable=False, unique=True, index=True),
        sa.Column("name", sa.String(255), nullable=False, unique=True),
        sa.Column("description", sa.Text(), nullable=True),
        sa.Column("is_active", sa.Boolean(), nullable=False, server_default=sa.true(), index=True),
        sa.Column("created_by", sa.Integer(), sa.ForeignKey("users.id"), nullable=True),
        sa.Column(
            "created_at",
            sa.DateTime(timezone=True),
            server_default=sa.func.now(),
            nullable=False,
        ),
        sa.Column("updated_at", sa.DateTime(timezone=True), nullable=True),
        sa.Column("deleted_at", sa.DateTime(timezone=True), nullable=True),
    )

    op.create_table(
        "feature_plan_items",
        sa.Column("id", sa.Integer(), primary_key=True, autoincrement=True),
        sa.Column(
            "plan_id",
            sa.Integer(),
            sa.ForeignKey("feature_plans.id", ondelete="CASCADE"),
            nullable=False,
            index=True,
        ),
        sa.Column(
            "feature_slug",
            sa.String(100),
            sa.ForeignKey("feature_flags.slug"),
            nullable=False,
            index=True,
        ),
        sa.Column("is_enabled", sa.Boolean(), nullable=False, server_default=sa.true()),
        sa.UniqueConstraint("plan_id", "feature_slug", name="uq_feature_plan_item"),
    )

    op.create_table(
        "merchant_feature_plans",
        sa.Column("id", sa.Integer(), primary_key=True, autoincrement=True),
        sa.Column(
            "merchant_id", sa.Integer(), sa.ForeignKey("merchants.id"), nullable=False, index=True
        ),
        sa.Column(
            "plan_id", sa.Integer(), sa.ForeignKey("feature_plans.id"), nullable=False, index=True
        ),
        sa.Column("is_active", sa.Boolean(), nullable=False, server_default=sa.true(), index=True),
        sa.Column("assigned_by", sa.Integer(), sa.ForeignKey("users.id"), nullable=True),
        sa.Column(
            "assigned_at",
            sa.DateTime(timezone=True),
            server_default=sa.func.now(),
            nullable=False,
        ),
        sa.Column("notes", sa.Text(), nullable=True),
    )

    op.create_table(
        "merchant_feature_overrides",
        sa.Column("id", sa.Integer(), primary_key=True, autoincrement=True),
        sa.Column(
            "merchant_id", sa.Integer(), sa.ForeignKey("merchants.id"), nullable=False, index=True
        ),
        sa.Column(
            "feature_slug",
            sa.String(100),
            sa.ForeignKey("feature_flags.slug"),
            nullable=False,
            index=True,
        ),
        sa.Column("is_enabled", sa.Boolean(), nullable=False),
        sa.Column("reason", sa.Text(), nullable=True),
        sa.Column("set_by", sa.Integer(), sa.ForeignKey("users.id"), nullable=True),
        sa.Column(
            "set_at",
            sa.DateTime(timezone=True),
            server_default=sa.func.now(),
            nullable=False,
        ),
        sa.UniqueConstraint("merchant_id", "feature_slug", name="uq_merchant_feature_override"),
    )

    # Seed feature flags
    op.bulk_insert(
        sa.table(
            "feature_flags",
            sa.column("slug", sa.String),
            sa.column("name", sa.String),
            sa.column("description", sa.Text),
            sa.column("is_default", sa.Boolean),
            sa.column("is_active", sa.Boolean),
        ),
        [
            {
                "slug": slug,
                "name": name,
                "description": description,
                "is_default": is_default,
                "is_active": True,
            }
            for slug, name, description, is_default in FEATURE_FLAGS
        ],
    )


def downgrade() -> None:
    op.drop_table("merchant_feature_overrides")
    op.drop_table("merchant_feature_plans")
    op.drop_table("feature_plan_items")
    op.drop_table("feature_plans")
    op.drop_table("feature_flags")
