import json
from datetime import datetime, timedelta, timezone
import sys
import types

import pytest

pymysql_stub = types.ModuleType("pymysql")


def _fake_connect(*args, **kwargs):
    raise RuntimeError("pymysql not available in tests")


pymysql_stub.connect = _fake_connect
pymysql_stub.cursors = types.ModuleType("pymysql.cursors")
pymysql_stub.cursors.DictCursor = object
sys.modules.setdefault("pymysql", pymysql_stub)
sys.modules.setdefault("pymysql.cursors", pymysql_stub.cursors)

import pipelet_ocpp_server as ocpp_server


@pytest.mark.asyncio
async def test_connected_stations_includes_start_method():
    connected_backup = dict(ocpp_server.connected)
    since_backup = dict(ocpp_server.connected_since)
    transactions_backup = dict(ocpp_server.current_transactions)
    try:
        ocpp_server.connected.clear()
        ocpp_server.connected_since.clear()
        ocpp_server.current_transactions.clear()

        ocpp_server.connected["CP_TEST"] = object()
        ocpp_server.connected_since["CP_TEST"] = datetime.now(timezone.utc) - timedelta(
            seconds=30
        )

        now = datetime.now(timezone.utc)
        ocpp_server.current_transactions[101] = {
            "chargepoint_id": "CP_TEST",
            "start_time": now,
            "connector_id": 1,
            "connector_id_int": 1,
            "oicp_enabled": False,
            "start_info": {"connectorId": 1, "idTag": "TAG1"},
            "start_method": "local",
        }
        ocpp_server.current_transactions[202] = {
            "chargepoint_id": "CP_TEST",
            "start_time": now,
            "connector_id": 2,
            "connector_id_int": 2,
            "oicp_enabled": False,
            "start_info": {"connectorId": 2, "idTag": "TOKEN"},
            "start_method": "remote",
        }

        response = await ocpp_server.api_connected_stations(types.SimpleNamespace())
        assert response.status == 200
        payload = json.loads(response.text)
        stations = payload["stations"]
        assert stations
        connectors = stations[0]["connectors"]
        local_connector = next(c for c in connectors if c["connectorId"] == 1)
        remote_connector = next(c for c in connectors if c["connectorId"] == 2)

        assert local_connector["startMethod"] == "local"
        assert local_connector["transactionId"] == "101"
        assert remote_connector["startMethod"] == "remote"
        assert remote_connector["transactionId"] == "202"
    finally:
        ocpp_server.connected.clear()
        ocpp_server.connected.update(connected_backup)
        ocpp_server.connected_since.clear()
        ocpp_server.connected_since.update(since_backup)
        ocpp_server.current_transactions.clear()
        ocpp_server.current_transactions.update(transactions_backup)
