import json

from threading import Lock
from inverterd import (
    Format,
    Client as InverterClient,
    InverterError
)

_lock = Lock()


class InverterClientWrapper:
    def __init__(self):
        self._inverter = None
        self._host = None
        self._port = None

    def init(self, host: str, port: int):
        self._host = host
        self._port = port
        self.create()

    def create(self):
        self._inverter = InverterClient(host=self._host, port=self._port)
        self._inverter.connect()

    def exec(self, command: str, arguments: tuple = (), format=Format.JSON):
        with _lock:
            try:
                self._inverter.format(format)
                response = self._inverter.exec(command, arguments)
                if format == Format.JSON:
                    response = json.loads(response)
                return response
            except InverterError as e:
                raise e
            except Exception as e:
                # silently try to reconnect
                try:
                    self.create()
                except Exception:
                    pass
                raise e


wrapper_instance = InverterClientWrapper()

