"""``build_embedding_provider`` — settings validation + provider build."""

from __future__ import annotations

import pytest
from pydantic import SecretStr

from everos.component.embedding import (
    OpenAIEmbeddingProvider,
    build_embedding_provider,
)
from everos.config.settings import EmbeddingSettings


def test_raises_when_model_missing() -> None:
    s = EmbeddingSettings(model=None, api_key=SecretStr("k"), base_url="https://x")
    with pytest.raises(ValueError, match="EVEROS_EMBEDDING__MODEL"):
        build_embedding_provider(s)


def test_raises_when_api_key_missing() -> None:
    s = EmbeddingSettings(model="m", api_key=None, base_url="https://x")
    with pytest.raises(ValueError, match="EVEROS_EMBEDDING__API_KEY"):
        build_embedding_provider(s)


def test_raises_when_base_url_missing() -> None:
    s = EmbeddingSettings(model="m", api_key=SecretStr("k"), base_url=None)
    with pytest.raises(ValueError, match="EVEROS_EMBEDDING__BASE_URL"):
        build_embedding_provider(s)


def test_builds_openai_embedding_provider_with_default_dim() -> None:
    s = EmbeddingSettings(model="m", api_key=SecretStr("k"), base_url="https://x")
    p = build_embedding_provider(s)
    assert isinstance(p, OpenAIEmbeddingProvider)


def test_custom_dim_passes_through() -> None:
    s = EmbeddingSettings(model="m", api_key=SecretStr("k"), base_url="https://x")
    p = build_embedding_provider(s, dim=512)
    assert isinstance(p, OpenAIEmbeddingProvider)
    # Provider stores dim on a private attr; assert via the public output shape
    # only if straightforward. Skip introspection if attr name differs.
    if hasattr(p, "_dim"):
        assert p._dim == 512
