import json

import tools.macbook_remote_tool as mac


BASE_CONFIG = {
    "enabled": True,
    "host": "100.84.71.27",
    "user": "ijeongho",
    "ssh_key": "default",
    "allowed_roots": ["/Users/ijeongho"],
    "blocked_subpaths": [".ssh", "Library/Keychains"],
    "blocked_name_fragments": [".env", "token", ".pem", ".key", "id_ed25519"],
    "max_depth": 3,
    "max_results": 100,
    "read_text_limit_bytes": 8000,
}


def install_config(monkeypatch, cfg=None):
    monkeypatch.setattr(mac, "_config", lambda: dict(cfg or BASE_CONFIG))


def test_health_does_not_require_approval(monkeypatch):
    install_config(monkeypatch)
    approvals = []
    monkeypatch.setattr(
        "tools.approval.request_tool_approval",
        lambda **kwargs: approvals.append(kwargs) or {"approved": False},
    )
    monkeypatch.setattr(
        mac,
        "_run_remote_python",
        lambda cfg, payload: {"ok": True, "action": payload["action"]},
    )

    result = json.loads(mac.macbook_remote("health"))

    assert result == {"ok": True, "action": "health"}
    assert approvals == []


def test_file_action_requires_approval_before_remote_execution(monkeypatch):
    install_config(monkeypatch)
    remote_calls = []
    approval_calls = []
    monkeypatch.setattr(
        "tools.approval.request_tool_approval",
        lambda **kwargs: approval_calls.append(kwargs) or {"approved": False, "message": "no"},
    )
    monkeypatch.setattr(mac, "_run_remote_python", lambda cfg, payload: remote_calls.append(payload))

    result = json.loads(mac.macbook_remote("list_dir", path="/Users/ijeongho/Downloads"))

    assert result["ok"] is False
    assert "no" in result["error"]
    assert approval_calls[0]["allow_permanent"] is True
    assert approval_calls[0]["allow_session"] is True
    assert approval_calls[0]["pattern_key"] == "macbook_remote:read:/Users/ijeongho"
    assert remote_calls == []



def test_expands_home_relative_paths_before_validation(monkeypatch):
    install_config(monkeypatch)
    monkeypatch.setattr(
        "tools.approval.request_tool_approval",
        lambda **kwargs: {"approved": True},
    )
    captured = {}
    monkeypatch.setattr(
        mac,
        "_run_remote_python",
        lambda cfg, payload: captured.update(payload) or {"ok": True, "items": []},
    )

    result = json.loads(mac.macbook_remote("search_files", root="Downloads", pattern="*.pdf"))

    assert result["ok"] is True
    assert captured["root"] == "/Users/ijeongho/Downloads"

def test_blocks_paths_outside_allowed_roots(monkeypatch):
    install_config(monkeypatch)

    result = json.loads(mac.macbook_remote("list_dir", path="/tmp"))

    assert result["ok"] is False
    assert "outside" in result["error"]


def test_blocks_sensitive_subpaths_and_names(monkeypatch):
    install_config(monkeypatch)

    ssh_result = json.loads(mac.macbook_remote("list_dir", path="/Users/ijeongho/.ssh"))
    env_result = json.loads(mac.macbook_remote("read_text_file", path="/Users/ijeongho/project/.env"))

    assert ssh_result["ok"] is False
    assert "blocked" in ssh_result["error"]
    assert env_result["ok"] is False
    assert "blocked" in env_result["error"]


def test_approved_search_uses_bounded_payload(monkeypatch):
    cfg = dict(BASE_CONFIG)
    cfg.update({"max_depth": 9, "max_results": 999, "read_text_limit_bytes": 999999})
    install_config(monkeypatch, cfg)
    monkeypatch.setattr(
        "tools.approval.request_tool_approval",
        lambda **kwargs: {"approved": True},
    )
    captured = {}

    def fake_remote(_cfg, payload):
        captured.update(payload)
        return {"ok": True, "items": []}

    monkeypatch.setattr(mac, "_run_remote_python", fake_remote)

    result = json.loads(mac.macbook_remote("search_files", root="/Users/ijeongho", pattern="*.pdf"))

    assert result["ok"] is True
    assert captured["action"] == "search_files"
    assert captured["pattern"] == "*.pdf"
    assert captured["max_depth"] == 8
    assert captured["max_results"] == 500
    assert captured["read_text_limit_bytes"] == 50000
