#pragma once

#include "RFXNames.h"
#include "EventSystem.h"

#ifdef ENABLE_PYTHON
    #include "../hardware/plugins/DelayedLink.h"
    #include "structmember.h"

    namespace Plugins {
      typedef struct {
          PyObject_HEAD
          PyObject *name; /* device name */
          PyObject *n_value_string;  /* n_value string */
          PyObject *s_value;  /* n_value string */
          PyObject *last_update_string;  /* last_update_string */
          int n_value;
          int type;
          int sub_type;
          int switch_type;
          int id;
      } PDevice;

      PyObject * PDevice_Describe(PDevice* self);

      void PDevice_dealloc(PDevice* self);
      int PDevice_init(PDevice *self, PyObject *args, PyObject *kwds);
      PyObject * PDevice_new(PyTypeObject *type, PyObject *args, PyObject *kwds);

      static PyMemberDef PDevice_members[] = {
	      { "name", T_OBJECT_EX, offsetof(PDevice, name), 0, "Device name" },
	      { "last_update_string", T_OBJECT_EX, offsetof(PDevice, last_update_string), 0, "Device last Update" },
	      { "n_value", T_INT, offsetof(PDevice, n_value), 0, "Device n_value" },
	      { "n_value_string", T_OBJECT_EX, offsetof(PDevice, n_value_string), 0, "Device n_value_string" },
	      { "s_value", T_OBJECT_EX, offsetof(PDevice, s_value), 0, "Device s_value" },
	      { "id", T_INT, offsetof(PDevice, id), 0, "Device id" },
	      { "type", T_INT, offsetof(PDevice, type), 0, "Device type" },
	      { "sub_type", T_INT, offsetof(PDevice, sub_type), 0, "Device subType" },
	      { "switch_type", T_INT, offsetof(PDevice, switch_type), 0, "Device switchType" },
	      { nullptr } /* Sentinel */
      };

      static PyMethodDef PDevice_methods[] = {
	      { "Describe", (PyCFunction)PDevice_Describe, METH_NOARGS, "Return the name, combining the first and last name" },
	      { nullptr } /* Sentinel */
      };

      static PyModuleDef PDevicemodule = { PyModuleDef_HEAD_INIT,
					   "DomoticzEvents",
					   "Example module that creates an extension type.",
					   -1,
					   nullptr,
					   nullptr,
					   nullptr,
					   nullptr,
					   nullptr };

      static PyTypeObject PDeviceType = {
	      PyVarObject_HEAD_INIT(nullptr, 0) "DomoticzEvents.PDevice", /* tp_name */
	      sizeof(PDevice),						  /* tp_basicsize */
	      0,							  /* tp_itemsize */
	      (destructor)PDevice_dealloc,				  /* tp_dealloc */
	      0,							  /* tp_print */
	      0,							  /* tp_getattr */
	      0,							  /* tp_setattr */
	      0,							  /* tp_reserved */
	      0,							  /* tp_repr */
	      0,							  /* tp_as_number */
	      0,							  /* tp_as_sequence */
	      0,							  /* tp_as_mapping */
	      0,							  /* tp_hash  */
	      0,							  /* tp_call */
	      0,							  /* tp_str */
	      0,							  /* tp_getattro */
	      0,							  /* tp_setattro */
	      0,							  /* tp_as_buffer */
	      Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,			  /* tp_flags */
	      "PDevice objects",					  /* tp_doc */
	      0,							  /* tp_traverse */
	      0,							  /* tp_clear */
	      0,							  /* tp_richcompare */
	      0,							  /* tp_weaklistoffset */
	      0,							  /* tp_iter */
	      0,							  /* tp_iternext */
	      PDevice_methods,						  /* tp_methods */
	      PDevice_members,						  /* tp_members */
	      0,							  /* tp_getset */
	      0,							  /* tp_base */
	      0,							  /* tp_dict */
	      0,							  /* tp_descr_get */
	      0,							  /* tp_descr_set */
	      0,							  /* tp_dictoffset */
	      (initproc)PDevice_init,					  /* tp_init */
	      0,							  /* tp_alloc */
	      PDevice_new,						  /* tp_new */
      };
    }
#endif
