"""initial tables

Revision ID: 21a606c2592a
Revises: 
Create Date: 2026-04-07 05:53:06.888319

"""
from typing import Sequence, Union

from alembic import op
import pgvector.sqlalchemy.vector
import sqlalchemy as sa
from sqlalchemy.dialects import postgresql

# revision identifiers, used by Alembic.
revision: str = '21a606c2592a'
down_revision: Union[str, Sequence[str], None] = None
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None


def upgrade() -> None:
    """Upgrade schema."""
    # ### commands auto generated by Alembic - please adjust! ###
    op.create_table('users',
    sa.Column('name', sa.String(length=100), nullable=True),
    sa.Column('is_global', sa.Boolean(), nullable=False),
    sa.Column('id', sa.Uuid(), nullable=False),
    sa.Column('created_at', sa.DateTime(), server_default=sa.text('now()'), nullable=False),
    sa.Column('updated_at', sa.DateTime(), server_default=sa.text('now()'), nullable=False),
    sa.PrimaryKeyConstraint('id')
    )
    op.create_table('face_embeddings',
    sa.Column('user_id', sa.Uuid(), nullable=False),
    sa.Column('embedding', sa.LargeBinary(), nullable=False),
    sa.Column('image_path', sa.String(length=500), nullable=True),
    sa.Column('id', sa.Uuid(), nullable=False),
    sa.Column('created_at', sa.DateTime(), server_default=sa.text('now()'), nullable=False),
    sa.Column('updated_at', sa.DateTime(), server_default=sa.text('now()'), nullable=False),
    sa.ForeignKeyConstraint(['user_id'], ['users.id'], ondelete='CASCADE'),
    sa.PrimaryKeyConstraint('id')
    )
    op.create_table('garments',
    sa.Column('user_id', sa.Uuid(), nullable=False),
    sa.Column('category_main', sa.String(length=20), nullable=False),
    sa.Column('category_sub', sa.String(length=50), nullable=True),
    sa.Column('description', sa.Text(), nullable=True),
    sa.Column('tags', postgresql.JSONB(astext_type=sa.Text()), nullable=True),
    sa.Column('source_image_path', sa.String(length=500), nullable=True),
    sa.Column('ghost_image_path', sa.String(length=500), nullable=True),
    sa.Column('embedding', pgvector.sqlalchemy.vector.VECTOR(dim=1536), nullable=True),
    sa.Column('id', sa.Uuid(), nullable=False),
    sa.Column('created_at', sa.DateTime(), server_default=sa.text('now()'), nullable=False),
    sa.Column('updated_at', sa.DateTime(), server_default=sa.text('now()'), nullable=False),
    sa.ForeignKeyConstraint(['user_id'], ['users.id'], ondelete='CASCADE'),
    sa.PrimaryKeyConstraint('id')
    )
    op.create_index('ix_garments_category_main', 'garments', ['category_main'], unique=False)
    op.create_index('ix_garments_tags', 'garments', ['tags'], unique=False, postgresql_using='gin')
    op.create_index('ix_garments_user_id', 'garments', ['user_id'], unique=False)
    # ### end Alembic commands ###

    # Seed global user
    op.execute(
        "INSERT INTO users (id, name, is_global, created_at, updated_at) "
        "VALUES ('00000000-0000-0000-0000-000000000000', 'Global', true, now(), now()) "
        "ON CONFLICT (id) DO NOTHING"
    )


def downgrade() -> None:
    """Downgrade schema."""
    # ### commands auto generated by Alembic - please adjust! ###
    op.drop_index('ix_garments_user_id', table_name='garments')
    op.drop_index('ix_garments_tags', table_name='garments', postgresql_using='gin')
    op.drop_index('ix_garments_category_main', table_name='garments')
    op.drop_table('garments')
    op.drop_table('face_embeddings')
    op.drop_table('users')
    # ### end Alembic commands ###
