"""contracts: add payment_token, payment_link_url, contract_sent_at, contract_email_sent_to

Revision ID: 0041
Revises: 0040
Create Date: 2026-07-01

Changes:
  - contracts: add payment_token VARCHAR(64) NULL UNIQUE
  - contracts: add payment_link_url TEXT NULL
  - contracts: add contract_sent_at TIMESTAMPTZ NULL
  - contracts: add contract_email_sent_to VARCHAR(255) NULL
  - contracts: partial index on payment_token WHERE NOT NULL
  - contracts: partial index on (tenant_id, contract_sent_at DESC) WHERE NOT NULL
"""
from alembic import op
import sqlalchemy as sa

revision = "0041"
down_revision = "0040"
branch_labels = None
depends_on = None


def upgrade() -> None:
    conn = op.get_bind()

    conn.execute(sa.text(
        "ALTER TABLE contracts ADD COLUMN IF NOT EXISTS payment_token VARCHAR(64)"
    ))
    conn.execute(sa.text(
        "ALTER TABLE contracts ADD COLUMN IF NOT EXISTS payment_link_url TEXT"
    ))
    conn.execute(sa.text(
        "ALTER TABLE contracts ADD COLUMN IF NOT EXISTS contract_sent_at TIMESTAMPTZ"
    ))
    conn.execute(sa.text(
        "ALTER TABLE contracts ADD COLUMN IF NOT EXISTS contract_email_sent_to VARCHAR(255)"
    ))

    conn.execute(sa.text("""
        DO $$
        BEGIN
            IF NOT EXISTS (
                SELECT 1 FROM pg_constraint
                WHERE conname = 'uq_contracts_payment_token'
            ) THEN
                ALTER TABLE contracts
                    ADD CONSTRAINT uq_contracts_payment_token UNIQUE (payment_token);
            END IF;
        END$$;
    """))

    conn.execute(sa.text("""
        CREATE INDEX IF NOT EXISTS ix_contracts_payment_token
        ON contracts (payment_token)
        WHERE payment_token IS NOT NULL
    """))

    conn.execute(sa.text("""
        CREATE INDEX IF NOT EXISTS ix_contracts_tenant_sent_at
        ON contracts (tenant_id, contract_sent_at DESC)
        WHERE contract_sent_at IS NOT NULL
    """))


def downgrade() -> None:
    conn = op.get_bind()
    conn.execute(sa.text("DROP INDEX IF EXISTS ix_contracts_tenant_sent_at"))
    conn.execute(sa.text("DROP INDEX IF EXISTS ix_contracts_payment_token"))
    conn.execute(sa.text(
        "ALTER TABLE contracts DROP CONSTRAINT IF EXISTS uq_contracts_payment_token"
    ))
    conn.execute(sa.text("ALTER TABLE contracts DROP COLUMN IF EXISTS contract_email_sent_to"))
    conn.execute(sa.text("ALTER TABLE contracts DROP COLUMN IF EXISTS contract_sent_at"))
    conn.execute(sa.text("ALTER TABLE contracts DROP COLUMN IF EXISTS payment_link_url"))
    conn.execute(sa.text("ALTER TABLE contracts DROP COLUMN IF EXISTS payment_token"))
