from sqlalchemy import text
from sqlalchemy.ext.asyncio import create_async_engine, async_sessionmaker, AsyncSession
from core.config import config
from database.models import Base

# ایجاد موتور دیتابیس ناهمگام
engine = create_async_engine(config.database_url, echo=False)

# ایجاد یک factory برای سشن‌ها
AsyncSessionLocal = async_sessionmaker(
    engine, class_=AsyncSession, expire_on_commit=False
)

async def init_models():
    async with engine.begin() as conn:
        # ساختن جداول دیتابیس در صورت عدم وجود
        await conn.run_sync(Base.metadata.create_all)
        
        # مهاجرت جدول orders برای ستون‌های جدید در صورت عدم وجود
        for col_name, col_type in [
            ("quantity", "INTEGER DEFAULT 1"),
            ("details", "TEXT"),
            ("payment_method", "TEXT"),
            ("midasbuy_order_no", "TEXT"),
            ("midasbuy_order_hash", "TEXT"),
            ("midasbuy_status", "TEXT"),
            ("midasbuy_payload", "TEXT"),
        ]:
            try:
                await conn.execute(text(f"ALTER TABLE orders ADD COLUMN {col_name} {col_type}"))
            except Exception:
                pass
                
        # مهاجرت جدول users برای ستون تلفن در صورت عدم وجود
        try:
            await conn.execute(text("ALTER TABLE users ADD COLUMN phone TEXT"))
        except Exception:
            pass
        
        # مهاجرت جدول users برای ستون ادمین بودن
        try:
            await conn.execute(text("ALTER TABLE users ADD COLUMN is_admin BOOLEAN DEFAULT 0"))
        except Exception:
            pass

        # مهاجرت جدول users برای ستون مسدود بودن
        try:
            await conn.execute(text("ALTER TABLE users ADD COLUMN is_blocked BOOLEAN DEFAULT 0"))
        except Exception:
            pass

        # مهاجرت جدول users برای ستون آیدی بازی ذخیره‌شده
        try:
            await conn.execute(text("ALTER TABLE users ADD COLUMN saved_player_id TEXT"))
        except Exception:
            pass

async def get_session() -> AsyncSession:
    async with AsyncSessionLocal() as session:
        yield session
