import sys
from logging.config import fileConfig
import asyncio
import os

from alembic import context
from sqlalchemy import pool
from sqlalchemy.ext.asyncio import async_engine_from_config
from sqlalchemy.engine import Connection

from dotenv import load_dotenv

# Завантажуємо змінні з .env
load_dotenv(".env")
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
# Alembic Config
config = context.config
fileConfig(config.config_file_name)

# Підключення до БД з .env
DB_USER = os.getenv("DB_USER", "root")
DB_PASSWORD = os.getenv("DB_PASSWORD", "password")
DB_HOST = os.getenv("DB_HOST", "localhost")
DB_PORT = os.getenv("DB_PORT", "3306")
DB_NAME = os.getenv("DB_NAME", "mydb")
DATABASE_URL = f"mysql+aiomysql://{DB_USER}:{DB_PASSWORD}@{DB_HOST}:{DB_PORT}/{DB_NAME}"

# Додаємо URL у конфіг
config.set_main_option("sqlalchemy.url", DATABASE_URL)

# Імпортуємо базу та моделі
from src.database import Base
from src.manufacturer import models as manufacturer_models
from src.address import models as address_models
from src.store import models as store_models
from src.user import models as user_models
from src.auth import models as auth_models
from src.customer import models as customer_models
from src.review import models as review_models
from src.category import models as category_models
from src.product import models as product_models
from src.cart import models as cart_models

target_metadata = Base.metadata


def run_migrations_offline():
    """Run migrations in 'offline' mode."""
    context.configure(
        url=DATABASE_URL,
        target_metadata=target_metadata,
        literal_binds=True,
        dialect_opts={"paramstyle": "named"},
    )

    with context.begin_transaction():
        context.run_migrations()


async def run_migrations_online():
    """Run migrations in 'online' mode with async engine."""
    connectable = async_engine_from_config(
        config.get_section(config.config_ini_section),
        prefix="sqlalchemy.",
        poolclass=pool.NullPool,
        future=True,
    )

    async with connectable.connect() as connection:
        await connection.run_sync(do_run_migrations)


def do_run_migrations(connection: Connection):
    context.configure(
        connection=connection,
        target_metadata=target_metadata,
        compare_type=True,
    )

    with context.begin_transaction():
        context.run_migrations()


if context.is_offline_mode():
    run_migrations_offline()
else:
    asyncio.run(run_migrations_online())
