import pytest
from pydantic import ValidationError

from app.core.config import Settings


def test_settings_defaults_for_local_development():
    settings = Settings(
        _env_file=None,
        ENVIRONMENT="development",
        OPENAI_API_KEY="",
    )
    assert settings.APP_NAME == "Embedding Engine"
    assert settings.DATABASE_NAME == "adpilot_indexing"
    assert settings.QDRANT_COLLECTION_NAME == "adpilot_embeddings"
    assert settings.CONSUMER_GROUP == "embedding-engine-service"
    assert settings.EMBEDDING_DIMENSION == 1536
    settings.validate_runtime()


def test_settings_accepts_env_alias():
    settings = Settings(_env_file=None, ENV="local")
    assert settings.resolved_environment() == "local"
    assert settings.is_local()


def test_stream_name_without_prefix():
    settings = Settings(_env_file=None, REDIS_STREAM_PREFIX="")
    assert settings.stream_name("graph.artifact.ready") == "graph.artifact.ready"


def test_stream_name_with_prefix():
    settings = Settings(_env_file=None, REDIS_STREAM_PREFIX="staging")
    assert settings.stream_name("graph.artifact.ready") == "staging.graph.artifact.ready"


def test_stream_name_with_prefix_already_dotted():
    settings = Settings(_env_file=None, REDIS_STREAM_PREFIX="staging.")
    assert settings.stream_name("commit.analysis.ready") == "staging.commit.analysis.ready"


def test_validate_runtime_requires_secrets_in_production():
    settings = Settings(
        _env_file=None,
        ENVIRONMENT="production",
        OPENAI_API_KEY="",
        MONGO_URI="",
    )
    with pytest.raises(ValueError, match="Missing required configuration"):
        settings.validate_runtime()


def test_validate_runtime_rejects_unsupported_provider():
    settings = Settings(
        _env_file=None,
        ENVIRONMENT="production",
        EMBEDDING_PROVIDER="voyage",
        OPENAI_API_KEY="sk-test",
        MONGO_URI="mongodb://localhost:27017",
        QDRANT_URL="http://localhost:6333",
        REDIS_URL="redis://localhost:6379/0",
        CELERY_BROKER_URL="redis://localhost:6379/0",
        CELERY_RESULT_BACKEND="redis://localhost:6379/1",
    )
    with pytest.raises(ValueError, match="Unsupported EMBEDDING_PROVIDER"):
        settings.validate_runtime()


def test_invalid_embedding_dimension():
    with pytest.raises(ValidationError):
        Settings(_env_file=None, EMBEDDING_DIMENSION=0)


def test_upstream_database_defaults():
    settings = Settings(_env_file=None)
    assert settings.resolved_docs_database() == "repo_docs"
    assert settings.resolved_code_chunks_database() == "adpilot_code_parser"
    assert settings.resolved_commit_analyses_database() == "adpilot_commit_intel"


def test_upstream_database_falls_back_to_database_name():
    settings = Settings(
        _env_file=None,
        DATABASE_NAME="adpilot_indexing",
        DOCS_MONGODB_DATABASE="",
        CODE_CHUNKS_MONGODB_DATABASE="",
        COMMIT_ANALYSES_MONGODB_DATABASE="",
    )
    assert settings.resolved_docs_database() == "adpilot_indexing"
    assert settings.resolved_code_chunks_database() == "adpilot_indexing"
    assert settings.resolved_commit_analyses_database() == "adpilot_indexing"
