"""Create customers table for sales master.

Revision ID: 017_customers
Revises: 016_po_workflow
Create Date: 2026-08-07
"""

from typing import Sequence, Union

import sqlalchemy as sa
from alembic import op

revision: str = "017_customers"
down_revision: Union[str, None] = "016_po_workflow"
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None


def upgrade() -> None:
    op.create_table(
        "customers",
        sa.Column("id", sa.String(length=36), primary_key=True),
        sa.Column("company_id", sa.String(length=36), nullable=False),
        sa.Column("code", sa.String(length=30), nullable=False),
        sa.Column("name", sa.String(length=200), nullable=False),
        sa.Column("business_type", sa.String(length=40), nullable=True),
        sa.Column("contact_person", sa.String(length=200), nullable=False, server_default=""),
        sa.Column("designation", sa.String(length=100), nullable=True),
        sa.Column("phone", sa.String(length=50), nullable=False, server_default=""),
        sa.Column("alternate_phone", sa.String(length=50), nullable=True),
        sa.Column("email", sa.String(length=255), nullable=True),
        sa.Column("website", sa.String(length=255), nullable=True),
        sa.Column("ntn", sa.String(length=50), nullable=True),
        sa.Column("sales_tax_no", sa.String(length=50), nullable=True),
        sa.Column("address_line1", sa.String(length=255), nullable=False, server_default=""),
        sa.Column("address_line2", sa.String(length=255), nullable=True),
        sa.Column("city", sa.String(length=100), nullable=False, server_default=""),
        sa.Column("state_province", sa.String(length=100), nullable=True),
        sa.Column("country", sa.String(length=100), nullable=False, server_default="Pakistan"),
        sa.Column("postal_code", sa.String(length=30), nullable=True),
        sa.Column("notes", sa.String(length=500), nullable=True),
        sa.Column("payment_terms", sa.String(length=30), nullable=True),
        sa.Column("payment_terms_days", sa.Integer(), nullable=False, server_default="30"),
        sa.Column("credit_limit", sa.Numeric(18, 2), nullable=False, server_default="0.00"),
        sa.Column("opening_balance", sa.Numeric(18, 2), nullable=False, server_default="0.00"),
        sa.Column("currency", sa.String(length=10), nullable=False, server_default="PKR"),
        sa.Column("so_prefix", sa.String(length=30), nullable=True),
        sa.Column("default_warehouse_id", sa.String(length=36), nullable=True),
        sa.Column("preferred_payment_method", sa.String(length=40), nullable=True),
        sa.Column("logo", sa.String(length=500), nullable=True),
        sa.Column("address", sa.String(length=500), nullable=True),
        sa.Column("account_id", sa.String(length=36), nullable=True),
        sa.Column("is_active", sa.Boolean(), nullable=False, server_default=sa.text("1")),
        sa.Column("created_at", sa.DateTime(), nullable=False),
        sa.Column("updated_at", sa.DateTime(), nullable=False),
        sa.ForeignKeyConstraint(["company_id"], ["companies.id"], ondelete="CASCADE"),
        sa.ForeignKeyConstraint(
            ["default_warehouse_id"], ["warehouses.id"], ondelete="SET NULL"
        ),
        sa.UniqueConstraint("company_id", "code", name="uq_customers_company_code"),
    )
    op.create_index("ix_customers_company_id", "customers", ["company_id"])
    op.create_index(
        "ix_customers_default_warehouse_id", "customers", ["default_warehouse_id"]
    )


def downgrade() -> None:
    op.drop_index("ix_customers_default_warehouse_id", table_name="customers")
    op.drop_index("ix_customers_company_id", table_name="customers")
    op.drop_table("customers")
