import importlib
import json
import sys


def _load_app(monkeypatch):
    monkeypatch.setenv(
        "PIPELET_PARTNER_TOKENS",
        json.dumps([{"token": "token123", "role": "CPO"}]),
    )
    sys.modules.pop("pipelet_rest_api", None)
    import pipelet_rest_api

    importlib.reload(pipelet_rest_api)
    return pipelet_rest_api.app, pipelet_rest_api


def test_datatransfer_requires_fields(monkeypatch):
    app, api = _load_app(monkeypatch)
    api.OCPP_ENDPOINT = "http://example.com"
    client = app.test_client()
    resp = client.post(
        "/api/datatransfer",
        json={"stationId": "demo-station"},
        headers={"Authorization": "Bearer token123"},
    )

    assert resp.status_code == 400
    assert "error" in resp.get_json()


def test_datatransfer_forwards_payload(monkeypatch):
    app, api = _load_app(monkeypatch)
    api.OCPP_ENDPOINT = "http://broker"

    captured = {}

    class DummyResponse:
        status_code = 200

        def json(self):
            return {"status": "ACCEPTED"}

        def raise_for_status(self):
            return None

    def fake_post(url, json=None, timeout=None):  # type: ignore[override]
        captured["url"] = url
        captured["json"] = json
        captured["timeout"] = timeout
        return DummyResponse()

    monkeypatch.setattr(api.requests, "post", fake_post)

    client = app.test_client()
    resp = client.post(
        "/api/datatransfer",
        json={
            "stationId": "demo-station",
            "vendorId": "ACME",
            "messageId": "Ping",
            "data": {"hello": "world"},
            "connectorId": 2,
        },
        headers={"Authorization": "Bearer token123"},
    )

    assert resp.status_code == 200
    assert resp.get_json().get("status") == "ACCEPTED"
    assert captured["url"].endswith("/api/pnc/ocpp-command")
    assert captured["json"]["station_id"] == "demo-station"
    assert captured["json"]["action"] == "custom_action"
    assert captured["json"]["ocpp_action"] == "DataTransfer"
    assert captured["json"]["payload"]["connectorId"] == 2
