import logging
from typing import Any, Coroutine, Dict
from uuid import UUID

from websockets import ConnectionClosed

from app.ocpp_proto.chargepoint import ChargePoint

__active_connections: Dict[UUID, ChargePoint] = {}

async def start(id: UUID, cp: ChargePoint):
    try:
        __active_connections[id] = cp
        await cp.start()
    except ConnectionClosed:
        logging.info("Charging station '%s' (%s) disconnected", cp.id, id)
        __active_connections.pop(id, None)

async def call(
    chargepoint_id: UUID,
    payload: Any,
    suppress: bool = True,
    unique_id: Any | None = None
) -> Coroutine[Any, Any, Any | None]:
    try:
        cp = __active_connections[chargepoint_id]
        return await cp.call(payload, suppress, unique_id)
    except KeyError as e:
        raise e
    
def is_connected(chargepoint_id: UUID):
    return chargepoint_id in __active_connections.keys()