"""
Integration Test Configuration
================================
連接真實 awoooi_dev PostgreSQL 資料庫

建立時間: 2026-04-04 (台北時區)
建立者: Claude Code (整合測試 Phase 1)

規則:
- 使用 awoooi_dev DB (非 prod)
- 每個測試後 rollback，保持 DB 乾淨
- 禁止 Mock — 必須使用真實 DB 連線
"""

import os

import pytest_asyncio
from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker, create_async_engine

# =============================================================================
# 強制使用 dev DB (絕對禁止打 prod)
# =============================================================================

DEV_DB_URL = os.environ.get(
    "TEST_DATABASE_URL",
    # 注意：密碼 awoooi_prod_2026 是 PostgreSQL 帳號的實際密碼（歷史命名），
    # 並非指向 prod DB — 連線目標為 awoooi_dev（開發資料庫）。
    "postgresql+asyncpg://awoooi:awoooi_prod_2026@192.168.0.188:5432/awoooi_dev?ssl=disable",
)

# 確保不會誤打 prod（允許密碼含 "prod" 字串，檢查 DB 名稱）
assert "awoooi_prod" not in DEV_DB_URL.split("/")[-1], (
    "TEST_DATABASE_URL 不可指向 prod DB（awoooi_prod）"
)


# =============================================================================
# DB Session Fixture (每個 test 獨立事務，結束後 rollback)
# =============================================================================

@pytest_asyncio.fixture
async def db_session():
    """
    提供真實 PostgreSQL 連線，每個測試後自動 rollback

    使用 SAVEPOINT 模式：測試可呼叫 session.flush() 取得 ID，
    但不會真正 commit — 測試結束後外層事務 rollback。
    """
    engine = create_async_engine(DEV_DB_URL, echo=False)
    factory = async_sessionmaker(
        bind=engine,
        class_=AsyncSession,
        expire_on_commit=False,
        autoflush=False,
    )

    async with engine.connect() as conn:
        await conn.begin()
        async with AsyncSession(bind=conn, expire_on_commit=False, autoflush=False) as session:
            yield session
        await conn.rollback()

    await engine.dispose()
