class SocketClient:
    def __init__(self, client_index):
        self.run_client = True
        self.client_connected = True
        self.client_index = client_index
        self.connection_handler = ConnectionHandler(str(client_index))

    def setup(self):
        self.connection_handler.socket_create()
        self.connection_handler.socket_connect()
        self.setup_sensor()

    def setup_sensor(self):
        while True:
            try:
                self.sensor = Sensor(self.client_index)
                print ("\33[32m\33[1mSuccessfully setup sensor \33[0m")
                break
            except Exception as e:
                print ("\33[31m\33[1mError setting up the sensor \33[0m")
                print (e)
                time.sleep(1)

    def read_sensor(self):
        try:
            sensor_data = self.sensor.get_data()
            return pickle.dumps(sensor_data)
        except Exception as e:
            print ("\n\33[93m\33[1mReinitalising sensor \33[0m")
            print (e)
            self.setup_sensor()

    def send(self):
        try:
            # print("Send to server")
            pickle_data = self.read_sensor()
            self.connection_handler.socket_send(pickle_data)
        except Exception as e:
            print (e)

    def listen(self):
        self.setup()
        while self.run_client:
            socket_code = self.connection_handler.connection_listen()
            self.execute_code(socket_code)

    def execute_code(self, socket_code):
        if socket_code == "send_data":
            self.send()
        elif socket_code == "calibrate":
            print("Calibration call")
            self.sensor.calibrate()
        elif socket_code == "disconnect_all":
            print("Disconnecting client")
            self.connection_handler.socket_close()
            self.run_client = False

    def monitor(self):
        while self.run_client:
            self.client_connected = self.connection_handler.check_connection()
            # print("Check connected", self.client_connected)
            time.sleep(1)

    def finish(self):
        self.connection_handler.socket_close()
        sys.exit()