"""Runtime AI credit packages (customer-facing credits, not codegen minutes).

Revision ID: 091
Revises: 090
"""
from alembic import op
import sqlalchemy as sa
from sqlalchemy.dialects import postgresql

revision = "091"
down_revision = "090"
branch_labels = None
depends_on = None


def upgrade() -> None:
    op.create_table(
        "runtime_ai_packages",
        sa.Column("id", postgresql.UUID(as_uuid=True), primary_key=True),
        sa.Column("slug", sa.String(50), nullable=False, unique=True),
        sa.Column("name", sa.String(100), nullable=False),
        sa.Column("description", sa.Text(), nullable=True),
        sa.Column("credits", sa.Integer(), nullable=False),
        sa.Column("price_minor", sa.BigInteger(), nullable=False),
        sa.Column("currency", sa.String(10), nullable=False, server_default="usd"),
        sa.Column("stripe_product_id", sa.String(100), nullable=True),
        sa.Column("stripe_price_id", sa.String(100), nullable=True),
        sa.Column("is_active", sa.Boolean(), nullable=False, server_default="true"),
        sa.Column("sort_order", sa.Integer(), nullable=False, server_default="0"),
        sa.Column("created_at", sa.DateTime(timezone=True), nullable=False, server_default=sa.text("now()")),
        sa.Column("updated_at", sa.DateTime(timezone=True), nullable=False, server_default=sa.text("now()")),
    )
    op.create_table(
        "runtime_ai_purchases",
        sa.Column("id", postgresql.UUID(as_uuid=True), primary_key=True),
        sa.Column("workspace_id", postgresql.UUID(as_uuid=True), sa.ForeignKey("workspaces.id", ondelete="CASCADE"), nullable=False),
        sa.Column("stripe_customer_id", sa.String(100), nullable=False),
        sa.Column("stripe_checkout_session_id", sa.String(100), nullable=True),
        sa.Column("stripe_payment_intent_id", sa.String(100), nullable=True),
        sa.Column("package_id", postgresql.UUID(as_uuid=True), sa.ForeignKey("runtime_ai_packages.id"), nullable=True),
        sa.Column("package_slug", sa.String(50), nullable=False),
        sa.Column("credits_purchased", sa.Integer(), nullable=False),
        sa.Column("millicredits_purchased", sa.Integer(), nullable=False),
        sa.Column("amount_minor", sa.BigInteger(), nullable=False),
        sa.Column("currency", sa.String(10), nullable=False, server_default="usd"),
        sa.Column("status", sa.String(30), nullable=False),
        sa.Column("paid_at", sa.DateTime(timezone=True), nullable=True),
        sa.Column("created_at", sa.DateTime(timezone=True), nullable=False, server_default=sa.text("now()")),
        sa.Column("updated_at", sa.DateTime(timezone=True), nullable=False, server_default=sa.text("now()")),
        sa.UniqueConstraint("stripe_checkout_session_id", name="uq_runtime_ai_purchase_session"),
    )
    op.create_table(
        "runtime_ai_ledger",
        sa.Column("id", postgresql.UUID(as_uuid=True), primary_key=True),
        sa.Column("workspace_id", postgresql.UUID(as_uuid=True), sa.ForeignKey("workspaces.id", ondelete="CASCADE"), nullable=False),
        sa.Column("entry_type", sa.String(30), nullable=False),
        sa.Column("millicredits_delta", sa.Integer(), nullable=False),
        sa.Column("balance_after", sa.Integer(), nullable=True),
        sa.Column("usage_product", sa.String(32), nullable=True),
        sa.Column("source_type", sa.String(50), nullable=True),
        sa.Column("source_id", sa.String(100), nullable=True),
        sa.Column("purchase_id", postgresql.UUID(as_uuid=True), sa.ForeignKey("runtime_ai_purchases.id"), nullable=True),
        sa.Column("project_id", postgresql.UUID(as_uuid=True), nullable=True),
        sa.Column("description", sa.Text(), nullable=True),
        sa.Column("metadata_json", postgresql.JSONB(), nullable=True),
        sa.Column("created_at", sa.DateTime(timezone=True), nullable=False, server_default=sa.text("now()")),
    )
    op.create_index("idx_runtime_ai_ledger_workspace", "runtime_ai_ledger", ["workspace_id", "created_at"])
    op.create_index(
        "idx_runtime_ai_ledger_source",
        "runtime_ai_ledger",
        ["workspace_id", "source_type", "source_id", "created_at"],
    )
    op.execute("""
        INSERT INTO runtime_ai_packages (id, slug, name, description, credits, price_minor, currency, is_active, sort_order)
        VALUES
          ('a1111111-1111-4111-8111-111111111111', 'runtime_ai_5k', '5,000 Runtime AI credits',
           'Pay-as-you-go credits for live chat and voice AI. Does not include codegen.', 5000, 900, 'usd', true, 10),
          ('a2222222-2222-4222-8222-222222222222', 'runtime_ai_25k', '25,000 Runtime AI credits',
           'Pay-as-you-go credits for live chat and voice AI. Does not include codegen.', 25000, 3500, 'usd', true, 20),
          ('a3333333-3333-4333-8333-333333333333', 'runtime_ai_100k', '100,000 Runtime AI credits',
           'Pay-as-you-go credits for live chat and voice AI. Does not include codegen.', 100000, 12000, 'usd', true, 30)
    """)


def downgrade() -> None:
    op.drop_index("idx_runtime_ai_ledger_source", table_name="runtime_ai_ledger")
    op.drop_index("idx_runtime_ai_ledger_workspace", table_name="runtime_ai_ledger")
    op.drop_table("runtime_ai_ledger")
    op.drop_table("runtime_ai_purchases")
    op.drop_table("runtime_ai_packages")
