from pathlib import Path

from api import TestClient


def test_machines(api: TestClient, test_flake: Path) -> None:
    response = api.get("/api/machines")
    assert response.status_code == 200
    assert response.json() == {"machines": []}

    response = api.post("/api/machines", json={"name": "test"})
    assert response.status_code == 201
    assert response.json() == {"machine": {"name": "test", "status": "unknown"}}

    response = api.get("/api/machines/test")
    assert response.status_code == 200
    assert response.json() == {"machine": {"name": "test", "status": "unknown"}}

    response = api.get("/api/machines")
    assert response.status_code == 200
    assert response.json() == {"machines": [{"name": "test", "status": "unknown"}]}


def test_configure_machine(api: TestClient, test_flake: Path) -> None:
    # ensure error 404 if machine does not exist when accessing the config
    response = api.get("/api/machines/machine1/config")
    assert response.status_code == 404

    # ensure error 404 if machine does not exist when writing to the config
    response = api.put("/api/machines/machine1/config", json={})
    assert response.status_code == 404

    # create the machine
    response = api.post("/api/machines", json={"name": "machine1"})
    assert response.status_code == 201

    # ensure an empty config is returned by default for a new machine
    response = api.get("/api/machines/machine1/config")
    assert response.status_code == 200
    assert response.json() == {"config": {}}

    # get jsonschema for machine
    response = api.get("/api/machines/machine1/schema")
    assert response.status_code == 200
    json_response = response.json()
    assert "schema" in json_response and "properties" in json_response["schema"]

    # set some config
    response = api.put(
        "/api/machines/machine1/config",
        json=dict(
            clan=dict(
                jitsi=True,
            )
        ),
    )
    assert response.status_code == 200
    assert response.json() == {"config": {"clan": {"jitsi": True}}}

    # get the config again
    response = api.get("/api/machines/machine1/config")
    assert response.status_code == 200
    assert response.json() == {"config": {"clan": {"jitsi": True}}}
