"""Initial revision

Revision ID: 25165517c582
Revises:
Create Date: 2020-01-01 20:14:45.905855

"""

from collections.abc import Sequence

import sqlalchemy as sa
from alembic import op

# revision identifiers, used by Alembic.
revision: str = "25165517c582"
down_revision: str | None = None
branch_labels: str | Sequence[str] | None = None
depends_on: str | Sequence[str] | None = None


def upgrade() -> None:
    # ### commands auto generated by Alembic - please adjust! ###
    op.create_table(
        "invoices",
        sa.Column("id", sa.Integer(), nullable=False),
        sa.Column("amount", sa.Numeric(precision=16, scale=8), nullable=False),
        sa.Column("status", sa.String(length=1000), nullable=False),
        sa.Column("date", sa.DateTime(timezone=True), nullable=False),
        sa.Column("buyer_email", sa.String(length=10000), nullable=True),
        sa.Column("discount", sa.Integer(), nullable=True),
        sa.Column("promocode", sa.Text(), nullable=True),
        sa.PrimaryKeyConstraint("id"),
    )
    op.create_index(op.f("ix_invoices_id"), "invoices", ["id"], unique=False)
    op.create_table(
        "stores",
        sa.Column("id", sa.Integer(), nullable=False),
        sa.Column("name", sa.String(length=1000), nullable=True),
        sa.Column("domain", sa.String(length=1000), nullable=True),
        sa.Column("template", sa.String(length=1000), nullable=True),
        sa.Column("email", sa.String(length=1000), nullable=True),
        sa.Column("email_host", sa.String(length=1000), nullable=True),
        sa.Column("email_password", sa.String(length=1000), nullable=True),
        sa.Column("email_port", sa.Integer(), nullable=True),
        sa.Column("email_use_ssl", sa.Boolean(), nullable=True),
        sa.Column("email_user", sa.String(length=1000), nullable=True),
        sa.PrimaryKeyConstraint("id"),
    )
    op.create_index(op.f("ix_stores_domain"), "stores", ["domain"], unique=False)
    op.create_index(op.f("ix_stores_email"), "stores", ["email"], unique=False)
    op.create_index(op.f("ix_stores_id"), "stores", ["id"], unique=False)
    op.create_index(op.f("ix_stores_name"), "stores", ["name"], unique=False)
    op.create_table(
        "users",
        sa.Column("id", sa.Integer(), nullable=False),
        sa.Column("email", sa.String(), nullable=True),
        sa.Column("hashed_password", sa.String(), nullable=True),
        sa.Column("is_superuser", sa.Boolean(), nullable=True),
        sa.PrimaryKeyConstraint("id"),
    )
    op.create_index(op.f("ix_users_email"), "users", ["email"], unique=True)
    op.create_index(op.f("ix_users_id"), "users", ["id"], unique=False)
    op.create_table(
        "discounts",
        sa.Column("id", sa.Integer(), nullable=False),
        sa.Column("user_id", sa.Integer(), nullable=True),
        sa.Column("name", sa.String(length=1000), nullable=True),
        sa.Column("percent", sa.Integer(), nullable=True),
        sa.Column("description", sa.Text(), nullable=True),
        sa.Column("promocode", sa.Text(), nullable=True),
        sa.Column("currencies", sa.String(length=10000), nullable=True),
        sa.Column("end_date", sa.DateTime(timezone=True), nullable=False),
        sa.ForeignKeyConstraint(["user_id"], ["users.id"], ondelete="SET NULL"),
        sa.PrimaryKeyConstraint("id"),
    )
    op.create_index(op.f("ix_discounts_currencies"), "discounts", ["currencies"], unique=False)
    op.create_index(op.f("ix_discounts_description"), "discounts", ["description"], unique=False)
    op.create_index(op.f("ix_discounts_id"), "discounts", ["id"], unique=False)
    op.create_index(op.f("ix_discounts_name"), "discounts", ["name"], unique=False)
    op.create_table(
        "paymentmethods",
        sa.Column("invoice_id", sa.Integer(), nullable=True),
        sa.Column("amount", sa.Numeric(precision=16, scale=8), nullable=False),
        sa.Column("discount", sa.Integer(), nullable=True),
        sa.Column("currency", sa.String(length=1000), nullable=True),
        sa.Column("payment_address", sa.String(length=10000), nullable=False),
        sa.Column("payment_url", sa.String(length=10000), nullable=False),
        sa.ForeignKeyConstraint(["invoice_id"], ["invoices.id"], ondelete="SET NULL"),
    )
    op.create_index(op.f("ix_paymentmethods_currency"), "paymentmethods", ["currency"], unique=False)
    op.create_table(
        "products",
        sa.Column("id", sa.Integer(), nullable=False),
        sa.Column("name", sa.String(length=1000), nullable=True),
        sa.Column("amount", sa.Numeric(precision=16, scale=8), nullable=False),
        sa.Column("quantity", sa.Numeric(precision=16, scale=8), nullable=False),
        sa.Column("download_url", sa.String(length=100000), nullable=True),
        sa.Column("date", sa.DateTime(timezone=True), nullable=False),
        sa.Column("category", sa.Text(), nullable=True),
        sa.Column("description", sa.Text(), nullable=True),
        sa.Column("image", sa.String(length=100000), nullable=True),
        sa.Column("store_id", sa.Integer(), nullable=True),
        sa.Column("status", sa.String(length=1000), nullable=False),
        sa.ForeignKeyConstraint(
            ["store_id"],
            ["stores.id"],
            ondelete="SET NULL",
            initially="DEFERRED",
            deferrable=True,
        ),
        sa.PrimaryKeyConstraint("id"),
    )
    op.create_index(op.f("ix_products_id"), "products", ["id"], unique=False)
    op.create_index(op.f("ix_products_name"), "products", ["name"], unique=False)
    op.create_index(op.f("ix_products_store_id"), "products", ["store_id"], unique=False)
    op.create_table(
        "wallets",
        sa.Column("id", sa.Integer(), nullable=False),
        sa.Column("name", sa.String(length=1000), nullable=True),
        sa.Column("xpub", sa.String(length=1000), nullable=True),
        sa.Column("currency", sa.String(length=1000), nullable=True),
        sa.Column("balance", sa.Numeric(precision=16, scale=8), nullable=True),
        sa.Column("user_id", sa.Integer(), nullable=True),
        sa.ForeignKeyConstraint(["user_id"], ["users.id"], ondelete="SET NULL"),
        sa.PrimaryKeyConstraint("id"),
    )
    op.create_index(op.f("ix_wallets_currency"), "wallets", ["currency"], unique=False)
    op.create_index(op.f("ix_wallets_id"), "wallets", ["id"], unique=False)
    op.create_index(op.f("ix_wallets_name"), "wallets", ["name"], unique=False)
    op.create_index(op.f("ix_wallets_xpub"), "wallets", ["xpub"], unique=False)
    op.create_table(
        "discountsxproducts",
        sa.Column("discount_id", sa.Integer(), nullable=True),
        sa.Column("product_id", sa.Integer(), nullable=True),
        sa.ForeignKeyConstraint(["discount_id"], ["discounts.id"], ondelete="SET NULL"),
        sa.ForeignKeyConstraint(["product_id"], ["products.id"], ondelete="SET NULL"),
    )
    op.create_table(
        "productsxinvoices",
        sa.Column("product_id", sa.Integer(), nullable=True),
        sa.Column("invoice_id", sa.Integer(), nullable=True),
        sa.ForeignKeyConstraint(["invoice_id"], ["invoices.id"], ondelete="SET NULL"),
        sa.ForeignKeyConstraint(["product_id"], ["products.id"], ondelete="SET NULL"),
    )
    op.create_table(
        "walletsxstores",
        sa.Column("wallet_id", sa.Integer(), nullable=True),
        sa.Column("store_id", sa.Integer(), nullable=True),
        sa.ForeignKeyConstraint(["store_id"], ["stores.id"], ondelete="SET NULL"),
        sa.ForeignKeyConstraint(["wallet_id"], ["wallets.id"], ondelete="SET NULL"),
    )
    # ### end Alembic commands ###


def downgrade() -> None:
    # ### commands auto generated by Alembic - please adjust! ###
    op.drop_table("walletsxstores")
    op.drop_table("productsxinvoices")
    op.drop_table("discountsxproducts")
    op.drop_index(op.f("ix_wallets_xpub"), table_name="wallets")
    op.drop_index(op.f("ix_wallets_name"), table_name="wallets")
    op.drop_index(op.f("ix_wallets_id"), table_name="wallets")
    op.drop_index(op.f("ix_wallets_currency"), table_name="wallets")
    op.drop_table("wallets")
    op.drop_index(op.f("ix_products_store_id"), table_name="products")
    op.drop_index(op.f("ix_products_name"), table_name="products")
    op.drop_index(op.f("ix_products_id"), table_name="products")
    op.drop_table("products")
    op.drop_index(op.f("ix_paymentmethods_currency"), table_name="paymentmethods")
    op.drop_table("paymentmethods")
    op.drop_index(op.f("ix_discounts_name"), table_name="discounts")
    op.drop_index(op.f("ix_discounts_id"), table_name="discounts")
    op.drop_index(op.f("ix_discounts_description"), table_name="discounts")
    op.drop_index(op.f("ix_discounts_currencies"), table_name="discounts")
    op.drop_table("discounts")
    op.drop_index(op.f("ix_users_id"), table_name="users")
    op.drop_index(op.f("ix_users_email"), table_name="users")
    op.drop_table("users")
    op.drop_index(op.f("ix_stores_name"), table_name="stores")
    op.drop_index(op.f("ix_stores_id"), table_name="stores")
    op.drop_index(op.f("ix_stores_email"), table_name="stores")
    op.drop_index(op.f("ix_stores_domain"), table_name="stores")
    op.drop_table("stores")
    op.drop_index(op.f("ix_invoices_id"), table_name="invoices")
    op.drop_table("invoices")
    # ### end Alembic commands ###
