import os
import sys

import pytest

from autogen import UserProxyAgent
from autogen.code_utils import (
    in_docker_container,
    is_docker_running,
)

sys.path.append(os.path.join(os.path.dirname(__file__), ".."))
from conftest import reason, skip_openai


def docker_running():
    return is_docker_running() or in_docker_container()


@pytest.mark.skipif(skip_openai, reason=reason)
def test_agent_setup_with_code_execution_off():
    user_proxy = UserProxyAgent(
        name="test_agent",
        human_input_mode="NEVER",
        code_execution_config=False,
    )

    assert user_proxy._code_execution_config is False


@pytest.mark.skipif(skip_openai, reason=reason)
def test_agent_setup_with_use_docker_false():
    user_proxy = UserProxyAgent(
        name="test_agent",
        human_input_mode="NEVER",
        code_execution_config={"use_docker": False},
    )

    assert user_proxy._code_execution_config["use_docker"] is False


@pytest.mark.skipif(skip_openai, reason=reason)
def test_agent_setup_with_env_variable_false_and_docker_running(monkeypatch):
    monkeypatch.setenv("AUTOGEN_USE_DOCKER", "False")

    user_proxy = UserProxyAgent(
        name="test_agent",
        human_input_mode="NEVER",
    )

    assert user_proxy._code_execution_config["use_docker"] is False


@pytest.mark.skipif(skip_openai or (not docker_running()), reason=reason + " OR docker not running")
def test_agent_setup_with_default_and_docker_running(monkeypatch):
    monkeypatch.delenv("AUTOGEN_USE_DOCKER", raising=False)

    assert os.getenv("AUTOGEN_USE_DOCKER") is None

    user_proxy = UserProxyAgent(
        name="test_agent",
        human_input_mode="NEVER",
    )

    assert os.getenv("AUTOGEN_USE_DOCKER") is None

    assert user_proxy._code_execution_config["use_docker"] is True


@pytest.mark.skipif(skip_openai or (docker_running()), reason=reason + " OR docker running")
def test_raises_error_agent_setup_with_default_and_docker_not_running(monkeypatch):
    monkeypatch.delenv("AUTOGEN_USE_DOCKER", raising=False)
    with pytest.raises(RuntimeError):
        UserProxyAgent(
            name="test_agent",
            human_input_mode="NEVER",
        )


@pytest.mark.skipif(skip_openai or (docker_running()), reason=" OR docker running")
def test_raises_error_agent_setup_with_env_variable_true_and_docker_not_running(monkeypatch):
    monkeypatch.setenv("AUTOGEN_USE_DOCKER", "True")

    with pytest.raises(RuntimeError):
        UserProxyAgent(
            name="test_agent",
            human_input_mode="NEVER",
        )


@pytest.mark.skipif(skip_openai or (not docker_running()), reason=" OR docker not running")
def test_agent_setup_with_env_variable_true_and_docker_running(monkeypatch):
    monkeypatch.setenv("AUTOGEN_USE_DOCKER", "True")

    user_proxy = UserProxyAgent(
        name="test_agent",
        human_input_mode="NEVER",
    )

    assert user_proxy._code_execution_config["use_docker"] is True
