"""SettingsRegistry — feature flag + 모델 설정 단일 조회 인터페이스.

Phase 2.4 (architecture-refactor-final/02-final-roadmap.md §Phase 2.4).

우선순위 (향후 project-level feature_flags 컬럼 도입 후):
  1. ProjectSettings.feature_flags (project-level override) — 미구현
  2. env settings (`app.core.config.settings`)
  3. step_manifest default_model (모델 조회 시)

현재 단계 (Phase 2.4): env fallback만 구현. 점진 교체로 호출측을 Registry 경유로 전환.
DB 컬럼 추가는 backward-compatible하게 후속 마이그레이션.
"""
from __future__ import annotations

import logging
from typing import Any, Dict, Optional

from sqlalchemy.orm import Session as OrmSession


logger = logging.getLogger(__name__)


_FEATURE_FLAG_ENV_MAP = {
    "fal_ai": "fal_ai_enabled",
}


class SettingsRegistry:
    """Feature flag + 모델 설정 조회."""

    @staticmethod
    def is_feature_enabled(
        feature: str,
        project_id: Optional[str] = None,
        db: Optional[OrmSession] = None,
    ) -> bool:
        """주어진 feature가 활성화되어 있는지.

        Args:
            feature: feature 식별자 (e.g. "fal_ai").
            project_id: project-level override 조회 시 필요 (Phase 2.4 DB 컬럼 추가 후).
            db: project-level override 조회 시 필요.

        Returns: True if enabled.

        향후 확장: ProjectSettings.feature_flags JSON 컬럼 도입 후 project override 우선.
        """
        # 1. project-level override (미구현 — Phase 2.4 후속)
        #    if project_id and db: ... read ProjectSettings.feature_flags ...

        # 2. env fallback
        from app.core.config import settings
        env_attr = _FEATURE_FLAG_ENV_MAP.get(feature)
        if env_attr is None:
            logger.warning("SettingsRegistry: unknown feature %r (no env mapping)", feature)
            return False
        return bool(getattr(settings, env_attr, False))

    @staticmethod
    def get_model_for_step(
        step_id: str,
        project_config: Optional[Dict[str, Any]] = None,
    ) -> str:
        """Step에 배정된 모델 이름.

        우선순위: project_config.models[step_id] > step_manifest.default_model > "gpt"
        """
        if project_config:
            models = project_config.get("models", {})
            override = models.get(step_id)
            if override:
                return str(override)

        from app.core.step_catalog import get_entry
        entry = get_entry(step_id)
        if entry and entry.default_model:
            return entry.default_model

        return "gpt"


__all__ = ["SettingsRegistry"]
