# Copyright (c) Meta Platforms, Inc. and affiliates.
# All rights reserved.
#
# This source code is licensed under the terms described in the LICENSE file in
# the root directory of this source tree.

import pytest
import pytest_asyncio

from llama_stack.distribution.datatypes import Api, ModelInput, Provider

from llama_stack.providers.tests.resolver import construct_stack_for_test
from ..conftest import ProviderFixture, remote_stack_fixture


@pytest.fixture(scope="session")
def eval_remote() -> ProviderFixture:
    return remote_stack_fixture()


@pytest.fixture(scope="session")
def eval_meta_reference() -> ProviderFixture:
    return ProviderFixture(
        providers=[
            Provider(
                provider_id="meta-reference",
                provider_type="inline::meta-reference",
                config={},
            )
        ],
    )


EVAL_FIXTURES = ["meta_reference", "remote"]


@pytest_asyncio.fixture(scope="session")
async def eval_stack(
    request,
    inference_model,
    judge_model,
    tool_group_input_memory,
    tool_group_input_tavily_search,
):
    fixture_dict = request.param

    providers = {}
    provider_data = {}
    for key in [
        "datasetio",
        "eval",
        "scoring",
        "inference",
        "agents",
        "safety",
        "vector_io",
        "tool_runtime",
    ]:
        fixture = request.getfixturevalue(f"{key}_{fixture_dict[key]}")
        providers[key] = fixture.providers
        if fixture.provider_data:
            provider_data.update(fixture.provider_data)

    test_stack = await construct_stack_for_test(
        [
            Api.eval,
            Api.datasetio,
            Api.inference,
            Api.scoring,
            Api.agents,
            Api.safety,
            Api.vector_io,
            Api.tool_runtime,
        ],
        providers,
        provider_data,
        models=[
            ModelInput(model_id=model)
            for model in [
                inference_model,
                judge_model,
            ]
        ],
        tool_groups=[tool_group_input_memory, tool_group_input_tavily_search],
    )

    return test_stack.impls
