"""
開發模式初始化腳本(無 Docker、無 PostgreSQL)。

功能:
  1. 用 SQLAlchemy 直接 create_all 把所有資料表建在 SQLite 檔(coba.db)
  2. 跑 seed:確認第一個 owner 帳號存在

執行方式(在 coba-backend 目錄下):
  ./.venv/Scripts/python.exe dev_init.py

執行成功後會在 coba-backend/coba.db 看到 SQLite 檔。

注意:這個腳本是「開發模式專用」,不是給上線用的。
上線版本走 Docker + PostgreSQL + Alembic migration。
"""

import asyncio
import os
import sys
from pathlib import Path

# 0. 強制 stdout 用 UTF-8(Windows 預設 cp950 印不出中文跟 unicode 符號)
try:
    sys.stdout.reconfigure(encoding="utf-8")
    sys.stderr.reconfigure(encoding="utf-8")
except (AttributeError, ValueError):
    pass

# 1. 強制把環境變數設成 SQLite 開發模式(放在 import app 之前)
DEV_DB_PATH = Path(__file__).parent / "coba.db"
os.environ["DATABASE_URL"] = f"sqlite+aiosqlite:///{DEV_DB_PATH.as_posix()}"
os.environ.setdefault("ENVIRONMENT", "development")
os.environ.setdefault("JWT_SECRET_KEY", "dev_secret_key_only_for_local_dont_use_in_prod")
os.environ.setdefault("JWT_ALGORITHM", "HS256")
os.environ.setdefault("ACCESS_TOKEN_EXPIRE_MINUTES", "15")
os.environ.setdefault("REFRESH_TOKEN_EXPIRE_DAYS", "7")
os.environ.setdefault("SEED_OWNER_EMAIL", "ssbb30529@gmail.com")
os.environ.setdefault("SEED_OWNER_PASSWORD", "a183b729")
os.environ.setdefault("SEED_OWNER_DISPLAY_NAME", "Robert Su")

# 2. 載入應用程式模組(注意必須在 os.environ 設定後才 import)
from app.database import Base, engine  # noqa: E402
from app.core.seed import seed_all  # noqa: E402
import app.models  # noqa: E402,F401  ← 必須 import,讓 Base.metadata 看到所有表


async def init() -> None:
    print(f"資料庫位置:{DEV_DB_PATH}")

    # 3. 建立所有資料表(階段 1-3 共 8 張)
    from sqlalchemy import text
    async with engine.begin() as conn:
        await conn.run_sync(Base.metadata.create_all)

        # 開發模式 mini-migration:現有 .db 檔加新欄位,避免砍掉重來
        # (上線環境走 alembic migration,這段只給 dev 用)
        DEV_MIGRATIONS = [
            ("channel_members", "last_read_at", "ALTER TABLE channel_members ADD COLUMN last_read_at TIMESTAMP"),
            ("messages", "tags", "ALTER TABLE messages ADD COLUMN tags JSON"),
        ]
        for table, column, ddl in DEV_MIGRATIONS:
            try:
                await conn.execute(text(ddl))
                print(f"[OK] 開發 migration:{table}.{column} 欄位已加上")
            except Exception:
                pass   # 欄位已存在或表還沒建,忽略

    print("[OK] 資料表建立完成")
    print(f"     {', '.join(sorted(Base.metadata.tables.keys()))}")

    # 4. Seed 第一個 owner + 6 個預設頻道
    await seed_all()
    print("[OK] Seed 完成")

    # 5. 收尾:關閉連線池
    await engine.dispose()


if __name__ == "__main__":
    asyncio.run(init())
    print("\n初始化完成。下一步:執行 dev_run.ps1 啟動 API 伺服器。")
