from __future__ import annotations

from typing import Any
from unittest.mock import MagicMock

from witty_agent_server.application.services.skill.openclaw_skill_client import (
    OpenClawSkillClient,
)
from witty_agent_server.application.services.skill.skill_client_port import (
    SkillClientPort,
)


def _make_gateway() -> MagicMock:
    gw = MagicMock()
    gw.get_skills_status.return_value = {"skills": []}
    gw.install_skill.return_value = {"ok": True}
    gw.uninstall_skill.return_value = {"ok": True}
    return gw


def test_openclaw_skill_client_satisfies_port() -> None:
    client = OpenClawSkillClient(gateway_client=_make_gateway())
    assert isinstance(client, SkillClientPort)


def test_get_skills_status_delegates() -> None:
    gw = _make_gateway()
    client = OpenClawSkillClient(gateway_client=gw)
    client.get_skills_status(agent_id="a1")
    gw.get_skills_status.assert_called_once_with(agent_id="a1")


def test_install_skill_delegates() -> None:
    gw = _make_gateway()
    client = OpenClawSkillClient(gateway_client=gw)
    result = client.install_skill(skill_name="s", agent_id="a1", version="v", force=True)
    gw.install_skill.assert_called_once_with(
        skill_name="s", agent_id="a1", version="v", force=True
    )
    assert result == {"ok": True}


def test_enable_skill_delegates() -> None:
    gw = _make_gateway()
    client = OpenClawSkillClient(gateway_client=gw)
    client.enable_skill(skill_name="s", agent_id="a1")
    gw.enable_skill.assert_called_once_with(skill_name="s", agent_id="a1")


def test_uninstall_skill_delegates() -> None:
    gw = _make_gateway()
    client = OpenClawSkillClient(gateway_client=gw)
    result = client.uninstall_skill(skill_name="s", agent_id="a1")
    gw.uninstall_skill.assert_called_once_with(skill_name="s", agent_id="a1")
    assert result == {"ok": True}