"""added bank transfer and added master data

Revision ID: ca4a89a32b78
Revises: 685ff26d2050
Create Date: 2025-10-08 09:25:05.065639

"""

from alembic import op
import sqlalchemy as sa


# revision identifiers, used by Alembic.
revision = "ca4a89a32b78"
down_revision = "685ff26d2050"
branch_labels = None
depends_on = None


def upgrade():
    # ### commands auto generated by Alembic - please adjust! ###
    op.create_table(
        "bank_transfer_transactions",
        sa.Column("id", sa.Integer(), nullable=False),
        sa.Column("amount", sa.Numeric(precision=12, scale=2), nullable=False),
        sa.Column("bank_name", sa.String(length=100), nullable=False),
        sa.Column("account_name", sa.String(length=100), nullable=False),
        sa.Column("account_number", sa.String(length=50), nullable=False),
        sa.Column("branch", sa.String(length=100), nullable=True),
        sa.Column("swift_code", sa.String(length=20), nullable=True),
        sa.Column("reference_number", sa.String(length=100), nullable=False),
        sa.Column("transfer_date", sa.DateTime(timezone=True), nullable=False),
        sa.Column("proof_of_payment_file", sa.LargeBinary(), nullable=True),
        sa.Column("proof_of_payment_filename", sa.String(length=255), nullable=True),
        sa.Column("proof_of_payment_mimetype", sa.String(length=100), nullable=True),
        sa.Column("sender_name", sa.String(length=100), nullable=True),
        sa.Column("sender_account", sa.String(length=50), nullable=True),
        sa.Column(
            "status",
            sa.Enum("PENDING", "VERIFIED", "REJECTED", name="paymentstatus"),
            nullable=False,
        ),
        sa.Column("verified_by", sa.String(length=100), nullable=True),
        sa.Column("verified_at", sa.DateTime(timezone=True), nullable=True),
        sa.Column("notes", sa.Text(), nullable=True),
        sa.Column("created_at", sa.DateTime(timezone=True), nullable=False),
        sa.Column("currency", sa.String(length=10), nullable=False),
        sa.PrimaryKeyConstraint("id"),
    )
    op.create_table(
        "paybill_transactions",
        sa.Column("id", sa.Integer(), nullable=False),
        sa.Column("amount", sa.Numeric(precision=12, scale=2), nullable=False),
        sa.Column("paybill_number", sa.String(length=20), nullable=False),
        sa.Column("account_number", sa.String(length=100), nullable=False),
        sa.Column("provider", sa.String(length=20), nullable=False),
        sa.Column("transaction_code", sa.String(length=50), nullable=True),
        sa.Column("phone_number", sa.String(length=15), nullable=True),
        sa.Column("transaction_date", sa.DateTime(timezone=True), nullable=True),
        sa.Column(
            "status",
            sa.Enum("PENDING", "VERIFIED", "REJECTED", name="paymentstatus"),
            nullable=False,
        ),
        sa.Column("confirmation_received", sa.Boolean(), nullable=True),
        sa.Column("confirmed_at", sa.DateTime(timezone=True), nullable=True),
        sa.Column("raw_callback_data", sa.JSON(), nullable=True),
        sa.Column("created_at", sa.DateTime(timezone=True), nullable=False),
        sa.Column("currency", sa.String(length=10), nullable=False),
        sa.PrimaryKeyConstraint("id"),
    )
    op.add_column(
        "payments",
        sa.Column("bank_transfer_transaction_id", sa.Integer(), nullable=True),
    )
    op.add_column(
        "payments", sa.Column("paybill_transaction_id", sa.Integer(), nullable=True)
    )
    op.create_foreign_key(
        "fk_payments_paybill_transaction_id",
        "payments",
        "paybill_transactions",
        ["paybill_transaction_id"],
        ["id"],
    )
    op.create_foreign_key(
        "fk_payments_bank_transfer_transaction_id",
        "payments",
        "bank_transfer_transactions",
        ["bank_transfer_transaction_id"],
        ["id"],
    )
    # ### end Alembic commands ###


def downgrade():
    # ### commands auto generated by Alembic - please adjust! ###
    op.drop_constraint(
        "fk_payments_paybill_transaction_id", "payments", type_="foreignkey"
    )
    op.drop_constraint(
        "fk_payments_bank_transfer_transaction_id", "payments", type_="foreignkey"
    )
    op.drop_column("payments", "paybill_transaction_id")
    op.drop_column("payments", "bank_transfer_transaction_id")
    op.drop_table("paybill_transactions")
    op.drop_table("bank_transfer_transactions")
    # ### end Alembic commands ###
