"""Add nutrition service tables

Revision ID: a2e71842cf5a
Revises: c78a12db4567
Create Date: 2025-10-16 10:00:00.000000

"""
from alembic import op
import sqlalchemy as sa
from sqlalchemy.dialects import postgresql

# revision identifiers, used by Alembic.
revision = "a2e71842cf5a"
down_revision = "c78a12db4567"
branch_labels = None
depends_on = None


def upgrade() -> None:
    # ### commands auto generated by Alembic - please adjust! ###
    
    # Создание таблицы food_items
    op.create_table(
        "food_items",
        sa.Column("id", sa.Integer(), nullable=False),
        sa.Column("uuid", postgresql.UUID(as_uuid=True), nullable=True),
        sa.Column("fatsecret_id", sa.String(length=50), nullable=True),
        sa.Column("name", sa.String(length=255), nullable=False),
        sa.Column("brand", sa.String(length=255), nullable=True),
        sa.Column("description", sa.Text(), nullable=True),
        sa.Column("food_type", sa.String(length=50), nullable=True),
        sa.Column("serving_size", sa.String(length=100), nullable=True),
        sa.Column("serving_weight_grams", sa.Float(), nullable=True),
        sa.Column("calories", sa.Float(), nullable=True),
        sa.Column("protein_grams", sa.Float(), nullable=True),
        sa.Column("fat_grams", sa.Float(), nullable=True),
        sa.Column("carbs_grams", sa.Float(), nullable=True),
        sa.Column("fiber_grams", sa.Float(), nullable=True),
        sa.Column("sugar_grams", sa.Float(), nullable=True),
        sa.Column("sodium_mg", sa.Float(), nullable=True),
        sa.Column("cholesterol_mg", sa.Float(), nullable=True),
        sa.Column("ingredients", sa.Text(), nullable=True),
        sa.Column("is_verified", sa.Boolean(), nullable=True),
        sa.Column(
            "created_at",
            sa.TIMESTAMP(timezone=True),
            server_default=sa.text("now()"),
            nullable=False,
        ),
        sa.Column("updated_at", sa.TIMESTAMP(timezone=True), nullable=True),
        sa.PrimaryKeyConstraint("id"),
    )
    op.create_index(
        op.f("ix_food_items_fatsecret_id"), "food_items", ["fatsecret_id"], unique=True
    )
    op.create_index(op.f("ix_food_items_uuid"), "food_items", ["uuid"], unique=True)
    
    # Создание таблицы user_nutrition_entries
    op.create_table(
        "user_nutrition_entries",
        sa.Column("id", sa.Integer(), nullable=False),
        sa.Column("uuid", postgresql.UUID(as_uuid=True), nullable=True),
        sa.Column("user_id", sa.Integer(), nullable=False),
        sa.Column("entry_date", sa.Date(), nullable=False),
        sa.Column("meal_type", sa.String(length=50), nullable=False),
        sa.Column("food_item_id", sa.Integer(), nullable=True),
        sa.Column("custom_food_name", sa.String(length=255), nullable=True),
        sa.Column("quantity", sa.Float(), nullable=False),
        sa.Column("unit", sa.String(length=50), nullable=True),
        sa.Column("calories", sa.Float(), nullable=True),
        sa.Column("protein_grams", sa.Float(), nullable=True),
        sa.Column("fat_grams", sa.Float(), nullable=True),
        sa.Column("carbs_grams", sa.Float(), nullable=True),
        sa.Column("notes", sa.Text(), nullable=True),
        sa.Column(
            "created_at",
            sa.TIMESTAMP(timezone=True),
            server_default=sa.text("now()"),
            nullable=False,
        ),
        sa.Column("updated_at", sa.TIMESTAMP(timezone=True), nullable=True),
        sa.ForeignKeyConstraint(["food_item_id"], ["food_items.id"],),
        sa.PrimaryKeyConstraint("id"),
    )
    op.create_index(
        op.f("ix_user_nutrition_entries_entry_date"),
        "user_nutrition_entries",
        ["entry_date"],
        unique=False,
    )
    op.create_index(
        op.f("ix_user_nutrition_entries_user_id"),
        "user_nutrition_entries",
        ["user_id"],
        unique=False,
    )
    op.create_index(
        op.f("ix_user_nutrition_entries_uuid"), 
        "user_nutrition_entries", 
        ["uuid"], 
        unique=True
    )
    
    # Создание таблицы water_intake
    op.create_table(
        "water_intake",
        sa.Column("id", sa.Integer(), nullable=False),
        sa.Column("uuid", postgresql.UUID(as_uuid=True), nullable=True),
        sa.Column("user_id", sa.Integer(), nullable=False),
        sa.Column("entry_date", sa.Date(), nullable=False),
        sa.Column("amount_ml", sa.Integer(), nullable=False),
        sa.Column(
            "entry_time",
            sa.TIMESTAMP(timezone=True),
            server_default=sa.text("now()"),
            nullable=False,
        ),
        sa.Column("notes", sa.Text(), nullable=True),
        sa.PrimaryKeyConstraint("id"),
    )
    op.create_index(
        op.f("ix_water_intake_entry_date"), "water_intake", ["entry_date"], unique=False
    )
    op.create_index(
        op.f("ix_water_intake_user_id"), "water_intake", ["user_id"], unique=False
    )
    op.create_index(op.f("ix_water_intake_uuid"), "water_intake", ["uuid"], unique=True)
    
    # Создание таблицы user_activity_entries
    op.create_table(
        "user_activity_entries",
        sa.Column("id", sa.Integer(), nullable=False),
        sa.Column("uuid", postgresql.UUID(as_uuid=True), nullable=True),
        sa.Column("user_id", sa.Integer(), nullable=False),
        sa.Column("entry_date", sa.Date(), nullable=False),
        sa.Column("activity_type", sa.String(length=100), nullable=False),
        sa.Column("duration_minutes", sa.Integer(), nullable=False),
        sa.Column("calories_burned", sa.Float(), nullable=True),
        sa.Column("distance_km", sa.Float(), nullable=True),
        sa.Column("steps", sa.Integer(), nullable=True),
        sa.Column("intensity", sa.String(length=20), nullable=True),
        sa.Column("notes", sa.Text(), nullable=True),
        sa.Column(
            "created_at",
            sa.TIMESTAMP(timezone=True),
            server_default=sa.text("now()"),
            nullable=False,
        ),
        sa.PrimaryKeyConstraint("id"),
    )
    op.create_index(
        op.f("ix_user_activity_entries_entry_date"),
        "user_activity_entries",
        ["entry_date"],
        unique=False,
    )
    op.create_index(
        op.f("ix_user_activity_entries_user_id"),
        "user_activity_entries",
        ["user_id"],
        unique=False,
    )
    op.create_index(
        op.f("ix_user_activity_entries_uuid"), 
        "user_activity_entries", 
        ["uuid"], 
        unique=True
    )
    
    # Создание таблицы nutrition_goals
    op.create_table(
        "nutrition_goals",
        sa.Column("id", sa.Integer(), nullable=False),
        sa.Column("user_id", sa.Integer(), nullable=False),
        sa.Column("daily_calorie_goal", sa.Integer(), nullable=True),
        sa.Column("protein_goal_grams", sa.Integer(), nullable=True),
        sa.Column("fat_goal_grams", sa.Integer(), nullable=True),
        sa.Column("carbs_goal_grams", sa.Integer(), nullable=True),
        sa.Column("water_goal_ml", sa.Integer(), nullable=True),
        sa.Column("activity_goal_minutes", sa.Integer(), nullable=True),
        sa.Column("weight_goal_kg", sa.Float(), nullable=True),
        sa.Column("goal_type", sa.String(length=50), nullable=True),
        sa.Column(
            "created_at",
            sa.TIMESTAMP(timezone=True),
            server_default=sa.text("now()"),
            nullable=False,
        ),
        sa.Column("updated_at", sa.TIMESTAMP(timezone=True), nullable=True),
        sa.PrimaryKeyConstraint("id"),
    )
    op.create_index(
        op.f("ix_nutrition_goals_user_id"), "nutrition_goals", ["user_id"], unique=True
    )
    # ### end Alembic commands ###


def downgrade() -> None:
    # ### commands auto generated by Alembic - please adjust! ###
    op.drop_index(op.f("ix_nutrition_goals_user_id"), table_name="nutrition_goals")
    op.drop_table("nutrition_goals")
    op.drop_index(op.f("ix_user_activity_entries_uuid"), table_name="user_activity_entries")
    op.drop_index(op.f("ix_user_activity_entries_user_id"), table_name="user_activity_entries")
    op.drop_index(op.f("ix_user_activity_entries_entry_date"), table_name="user_activity_entries")
    op.drop_table("user_activity_entries")
    op.drop_index(op.f("ix_water_intake_uuid"), table_name="water_intake")
    op.drop_index(op.f("ix_water_intake_user_id"), table_name="water_intake")
    op.drop_index(op.f("ix_water_intake_entry_date"), table_name="water_intake")
    op.drop_table("water_intake")
    op.drop_index(op.f("ix_user_nutrition_entries_uuid"), table_name="user_nutrition_entries")
    op.drop_index(op.f("ix_user_nutrition_entries_user_id"), table_name="user_nutrition_entries")
    op.drop_index(op.f("ix_user_nutrition_entries_entry_date"), table_name="user_nutrition_entries")
    op.drop_table("user_nutrition_entries")
    op.drop_index(op.f("ix_food_items_uuid"), table_name="food_items")
    op.drop_index(op.f("ix_food_items_fatsecret_id"), table_name="food_items")
    op.drop_table("food_items")
    # ### end Alembic commands ###