"""initial

Revision ID: 0001_initial
Revises: 
Create Date: 2026-08-12 00:00:00.000000
"""
from alembic import op
import sqlalchemy as sa

# revision identifiers, used by Alembic.
revision = '0001_initial'
down_revision = None
branch_labels = None
depends_on = None


def upgrade():
    # ### commands auto generated ###
    sa.Enum('admin','designer','operator', name='userrole').create(op.get_bind(), checkfirst=True)
    sa.Enum('ink','paper','garment','other', name='inventorytype').create(op.get_bind(), checkfirst=True)
    sa.Enum('pending','en_diseno','sublimando','listo_para_entrega','cancelado', name='orderstatus').create(op.get_bind(), checkfirst=True)

    op.create_table('users',
        sa.Column('id', sa.Integer(), primary_key=True, nullable=False),
        sa.Column('username', sa.String(length=100), nullable=False),
        sa.Column('email', sa.String(length=255), nullable=True),
        sa.Column('password_hash', sa.String(length=255), nullable=False),
        sa.Column('role', sa.Enum(name='userrole'), nullable=False),
        sa.Column('full_name', sa.String(length=255), nullable=True),
        sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True),
    )

    op.create_table('clients',
        sa.Column('id', sa.Integer(), primary_key=True, nullable=False),
        sa.Column('full_name', sa.String(length=255), nullable=False),
        sa.Column('company_name', sa.String(length=255), nullable=True),
        sa.Column('email', sa.String(length=255), nullable=True),
        sa.Column('phone', sa.String(length=50), nullable=True),
        sa.Column('notes', sa.Text(), nullable=True),
        sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True),
        sa.Column('updated_at', sa.DateTime(timezone=True), nullable=True),
    )

    op.create_table('client_addresses',
        sa.Column('id', sa.Integer(), primary_key=True, nullable=False),
        sa.Column('client_id', sa.Integer(), sa.ForeignKey('clients.id'), nullable=False),
        sa.Column('label', sa.String(length=100), nullable=True),
        sa.Column('street', sa.String(length=255), nullable=True),
        sa.Column('city', sa.String(length=100), nullable=True),
        sa.Column('state', sa.String(length=100), nullable=True),
        sa.Column('postal_code', sa.String(length=20), nullable=True),
        sa.Column('country', sa.String(length=100), nullable=True),
        sa.Column('is_default', sa.Boolean(), nullable=True),
        sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True),
    )

    op.create_table('client_preferences',
        sa.Column('id', sa.Integer(), primary_key=True, nullable=False),
        sa.Column('client_id', sa.Integer(), sa.ForeignKey('clients.id'), nullable=False),
        sa.Column('key', sa.String(length=100), nullable=False),
        sa.Column('value', sa.String(length=255), nullable=True),
        sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True),
    )

    op.create_table('suppliers',
        sa.Column('id', sa.Integer(), primary_key=True, nullable=False),
        sa.Column('name', sa.String(length=255), nullable=False),
        sa.Column('contact_info', sa.Text(), nullable=True),
        sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True),
    )

    op.create_table('products',
        sa.Column('id', sa.Integer(), primary_key=True, nullable=False),
        sa.Column('sku', sa.String(length=100), nullable=True),
        sa.Column('name', sa.String(length=255), nullable=False),
        sa.Column('description', sa.Text(), nullable=True),
        sa.Column('category', sa.String(length=100), nullable=True),
        sa.Column('base_price', sa.Float(), nullable=True),
        sa.Column('active', sa.Boolean(), nullable=True),
        sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True),
    )

    op.create_table('product_variants',
        sa.Column('id', sa.Integer(), primary_key=True, nullable=False),
        sa.Column('product_id', sa.Integer(), sa.ForeignKey('products.id'), nullable=False),
        sa.Column('name', sa.String(length=255), nullable=True),
        sa.Column('canvas_width_mm', sa.Float(), nullable=True),
        sa.Column('canvas_height_mm', sa.Float(), nullable=True),
        sa.Column('dpi_recommended', sa.Integer(), nullable=True),
        sa.Column('blank_item_sku', sa.String(length=100), nullable=True),
        sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True),
    )

    op.create_table('designs',
        sa.Column('id', sa.Integer(), primary_key=True, nullable=False),
        sa.Column('filename', sa.String(length=1024), nullable=False),
        sa.Column('original_filename', sa.String(length=255), nullable=True),
        sa.Column('mime_type', sa.String(length=100), nullable=True),
        sa.Column('uploader_user_id', sa.Integer(), sa.ForeignKey('users.id'), nullable=True),
        sa.Column('approved', sa.Boolean(), nullable=True),
        sa.Column('notes', sa.Text(), nullable=True),
        sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True),
    )

    op.create_table('orders',
        sa.Column('id', sa.Integer(), primary_key=True, nullable=False),
        sa.Column('order_number', sa.String(length=100), nullable=False),
        sa.Column('client_id', sa.Integer(), sa.ForeignKey('clients.id'), nullable=False),
        sa.Column('delivery_address_id', sa.Integer(), sa.ForeignKey('client_addresses.id'), nullable=True),
        sa.Column('status', sa.Enum(name='orderstatus'), nullable=False),
        sa.Column('total_amount', sa.Float(), nullable=True),
        sa.Column('deposit_paid', sa.Float(), nullable=True),
        sa.Column('due_date', sa.DateTime(timezone=True), nullable=True),
        sa.Column('notes', sa.Text(), nullable=True),
        sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True),
        sa.Column('updated_at', sa.DateTime(timezone=True), nullable=True),
    )

    op.create_table('order_items',
        sa.Column('id', sa.Integer(), primary_key=True, nullable=False),
        sa.Column('order_id', sa.Integer(), sa.ForeignKey('orders.id'), nullable=False),
        sa.Column('product_variant_id', sa.Integer(), sa.ForeignKey('product_variants.id'), nullable=False),
        sa.Column('design_id', sa.Integer(), sa.ForeignKey('designs.id'), nullable=True),
        sa.Column('quantity', sa.Integer(), nullable=False),
        sa.Column('unit_price', sa.Float(), nullable=True),
        sa.Column('subtotal', sa.Float(), nullable=True),
        sa.Column('status', sa.String(length=50), nullable=True),
        sa.Column('canvas_custom_width_mm', sa.Float(), nullable=True),
        sa.Column('canvas_custom_height_mm', sa.Float(), nullable=True),
        sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True),
        sa.Column('updated_at', sa.DateTime(timezone=True), nullable=True),
    )

    op.create_table('inventory_items',
        sa.Column('id', sa.Integer(), primary_key=True, nullable=False),
        sa.Column('sku', sa.String(length=100), nullable=True),
        sa.Column('name', sa.String(length=255), nullable=False),
        sa.Column('type', sa.Enum(name='inventorytype'), nullable=False),
        sa.Column('unit', sa.String(length=50), nullable=True),
        sa.Column('quantity_on_hand', sa.Float(), nullable=False),
        sa.Column('min_threshold', sa.Float(), nullable=True),
        sa.Column('location', sa.String(length=255), nullable=True),
        sa.Column('supplier_id', sa.Integer(), sa.ForeignKey('suppliers.id'), nullable=True),
        sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True),
    )

    op.create_table('product_components',
        sa.Column('id', sa.Integer(), primary_key=True, nullable=False),
        sa.Column('product_variant_id', sa.Integer(), sa.ForeignKey('product_variants.id'), nullable=False),
        sa.Column('inventory_item_id', sa.Integer(), sa.ForeignKey('inventory_items.id'), nullable=False),
        sa.Column('qty_per_unit', sa.Float(), nullable=False),
        sa.Column('unit', sa.String(length=50), nullable=True),
    )

    op.create_table('inventory_movements',
        sa.Column('id', sa.Integer(), primary_key=True, nullable=False),
        sa.Column('inventory_item_id', sa.Integer(), sa.ForeignKey('inventory_items.id'), nullable=False),
        sa.Column('change_qty', sa.Float(), nullable=False),
        sa.Column('movement_type', sa.String(length=50), nullable=False),
        sa.Column('reference_type', sa.String(length=50), nullable=True),
        sa.Column('reference_id', sa.Integer(), nullable=True),
        sa.Column('notes', sa.Text(), nullable=True),
        sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True),
    )

    op.create_table('inventory_reservations',
        sa.Column('id', sa.Integer(), primary_key=True, nullable=False),
        sa.Column('order_item_id', sa.Integer(), sa.ForeignKey('order_items.id'), nullable=False),
        sa.Column('inventory_item_id', sa.Integer(), sa.ForeignKey('inventory_items.id'), nullable=False),
        sa.Column('qty_reserved', sa.Float(), nullable=False),
        sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True),
        sa.Column('released_at', sa.DateTime(timezone=True), nullable=True),
    )
    # ### end Alembic commands ###


def downgrade():
    # ### commands auto generated ###
    op.drop_table('inventory_reservations')
    op.drop_table('inventory_movements')
    op.drop_table('product_components')
    op.drop_table('inventory_items')
    op.drop_table('order_items')
    op.drop_table('orders')
    op.drop_table('designs')
    op.drop_table('product_variants')
    op.drop_table('products')
    op.drop_table('suppliers')
    op.drop_table('client_preferences')
    op.drop_table('client_addresses')
    op.drop_table('clients')
    op.drop_table('users')

    sa.Enum('pending','en_diseno','sublimando','listo_para_entrega','cancelado', name='orderstatus').drop(op.get_bind(), checkfirst=True)
    sa.Enum('ink','paper','garment','other', name='inventorytype').drop(op.get_bind(), checkfirst=True)
    sa.Enum('admin','designer','operator', name='userrole').drop(op.get_bind(), checkfirst=True)
    # ### end Alembic commands ###
