"""Add item_types table and items.item_type_id.

Revision ID: 004_item_types
Revises: 003_drop_category_parent
Create Date: 2026-08-02

"""

from typing import Sequence, Union

import sqlalchemy as sa
from alembic import op

revision: str = "004_item_types"
down_revision: Union[str, None] = "003_drop_category_parent"
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None


def upgrade() -> None:
    op.create_table(
        "item_types",
        sa.Column("id", sa.String(length=36), nullable=False),
        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("description", sa.Text(), nullable=True),
        sa.Column("is_active", sa.Boolean(), nullable=False),
        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.PrimaryKeyConstraint("id"),
        sa.UniqueConstraint("company_id", "code", name="uq_item_types_company_code"),
    )
    op.create_index("ix_item_types_company_id", "item_types", ["company_id"], unique=False)

    op.add_column("items", sa.Column("item_type_id", sa.String(length=36), nullable=True))
    op.create_index("ix_items_item_type_id", "items", ["item_type_id"], unique=False)
    op.create_foreign_key(
        "fk_items_item_type_id",
        "items",
        "item_types",
        ["item_type_id"],
        ["id"],
        ondelete="SET NULL",
    )


def downgrade() -> None:
    op.drop_constraint("fk_items_item_type_id", "items", type_="foreignkey")
    op.drop_index("ix_items_item_type_id", table_name="items")
    op.drop_column("items", "item_type_id")
    op.drop_index("ix_item_types_company_id", table_name="item_types")
    op.drop_table("item_types")
