"""Config package facade for get/set/load and test resets.

``get_config()`` is a process-wide live snapshot. On-disk schema, Settings
field metadata, and the resolver live in ``transcriptx.core.config``. Hydrate
this facade via ``apply_project_config_to_live_facade`` at app start and after
Settings save. New Settings knobs must land on a Pydantic model (or the frozen
non-pydantic baseline), not as dataclass-only fields.
"""

from .analysis import (
    AnalysisConfig,
    SpeakerExemplarsConfig,
    HighlightsConfig,
    SummaryConfig,
    TopicModelingConfig,
    BERTopicConfig,
    ActsConfig,
    TagExtractionConfig,
    QAAnalysisConfig,
    TemporalDynamicsConfig,
    VectorizationConfig,
    VoiceConfig,
)
from .workflow import (
    WorkflowConfig,
    InputConfig,
    OutputConfig,
    GroupAnalysisConfig,
    DashboardConfig,
    MetadataConfig,
    SpeakerGateConfig,
)
from .system import LLMConfig, LoggingConfig, AudioPreprocessingConfig
from .main import (
    TranscriptXConfig,
)
from . import main as _main
from .config_errors import ConfigLoadError
from .base import (
    EMOTION_CATEGORIES,
    ACT_TYPES,
    DEFAULT_NER_LABELS,
    DEFAULT_STOPWORDS,
    STOPWORDS_FILE,
    TICS_FILE,
    DISCOURSE_STOPLIST_FILE,
    THEME_PHRASE_RESOURCES_FILE,
)

_global_config = None


def get_config() -> TranscriptXConfig:
    """Get the global configuration instance."""
    global _global_config
    if _global_config is None:
        if getattr(_main, "_config", None) is not None:
            _global_config = _main._config
        else:
            _global_config = TranscriptXConfig()
    _main.set_config(_global_config)
    return _global_config


def set_config(config: TranscriptXConfig) -> None:
    """Set the global configuration instance."""
    global _global_config
    _global_config = config
    _main.set_config(config)


def load_config(config_file: str) -> TranscriptXConfig:
    """Load configuration from file and set as global config."""
    config = TranscriptXConfig(config_file)
    set_config(config)
    return config


def reset_config_for_tests() -> None:
    """
    Clear the global config so tests do not leak state across modules.
    For use in fixtures or teardown only.
    """
    global _global_config
    _global_config = None
    if hasattr(_main, "_config"):
        _main._config = None


__all__ = [
    "ConfigLoadError",
    "AnalysisConfig",
    "SpeakerExemplarsConfig",
    "HighlightsConfig",
    "SummaryConfig",
    "TopicModelingConfig",
    "BERTopicConfig",
    "ActsConfig",
    "TagExtractionConfig",
    "QAAnalysisConfig",
    "TemporalDynamicsConfig",
    "VectorizationConfig",
    "VoiceConfig",
    "WorkflowConfig",
    "InputConfig",
    "OutputConfig",
    "GroupAnalysisConfig",
    "DashboardConfig",
    "MetadataConfig",
    "SpeakerGateConfig",
    "LLMConfig",
    "LoggingConfig",
    "AudioPreprocessingConfig",
    "TranscriptXConfig",
    "get_config",
    "set_config",
    "load_config",
    "reset_config_for_tests",
    "EMOTION_CATEGORIES",
    "ACT_TYPES",
    "DEFAULT_NER_LABELS",
    "DEFAULT_STOPWORDS",
    "STOPWORDS_FILE",
    "TICS_FILE",
    "DISCOURSE_STOPLIST_FILE",
    "THEME_PHRASE_RESOURCES_FILE",
]
