"""기본 계정 bootstrap (W2-F15 Codex M2 수용).

`app.main` 전체를 import하지 않고도 CLI가 쓸 수 있도록 분리된 helper.
multi-worker 경쟁 조건에 대비해 IntegrityError는 benign no-op.
"""
from __future__ import annotations

import logging
import uuid
from datetime import datetime, timezone

from sqlalchemy.exc import IntegrityError

from app.core.config import settings
from app.core.security import hash_password
from app.models.catalog import UserAccount

logger = logging.getLogger(__name__)


def ensure_default_user(db, username: str, password: str, role: str, display_name: str) -> None:
    """해당 username이 없으면 생성. multi-worker race는 IntegrityError로 흡수 (Codex High 2).

    설명:
    - SELECT → INSERT → COMMIT은 두 worker가 동시에 "없다"고 보고 둘 다 INSERT할 수 있다.
    - username UNIQUE 제약 덕에 두 번째 COMMIT은 IntegrityError로 실패.
    - 이 경우 "이미 있으면 OK"가 정답이므로 rollback + 무시.
    """
    existing = db.query(UserAccount).filter(UserAccount.username == username).first()
    if existing:
        return
    now = datetime.now(timezone.utc).isoformat()
    user = UserAccount(
        id=str(uuid.uuid4()),
        username=username,
        display_name=display_name,
        password_hash=hash_password(password),
        role=role,
        is_active=1,
        created_at=now,
        updated_at=now,
    )
    db.add(user)
    try:
        db.commit()
    except IntegrityError:
        # 다른 worker가 먼저 생성. rollback 후 no-op.
        db.rollback()
        logger.info("default user %s already exists (concurrent bootstrap)", username)


def bootstrap_default_users(db) -> None:
    """2개 기본 계정(admin, creator) 생성. CLI/lifespan 공통 진입점."""
    ensure_default_user(
        db, settings.default_admin_username, settings.default_admin_password,
        "admin", "관리자",
    )
    ensure_default_user(
        db, settings.default_creator_username, settings.default_creator_password,
        "creator", "크리에이터",
    )
