#ifndef SBK_COLLECTIONCALENDARWRAPPER_H
#define SBK_COLLECTIONCALENDARWRAPPER_H

// Workaround to access protected functions
#ifndef protected
#  define protected public
#endif

#include <collectioncalendar.h>

#include <sbkpython.h>

#include <array>
namespace Shiboken { struct AutoDecRef; class GilState; }

namespace PySide { class DynamicQMetaObject; }

class CollectionCalendarWrapper : public Akonadi::CollectionCalendar
{
public:
    CollectionCalendarWrapper(::QAbstractItemModel * model, const ::Akonadi::Collection & col, ::QObject * parent = nullptr);
    CollectionCalendarWrapper(const ::Akonadi::Collection & col, ::QObject * parent = nullptr);
    CollectionCalendarWrapper(const CollectionCalendarWrapper &) = delete;
    CollectionCalendarWrapper& operator=(const CollectionCalendarWrapper &) = delete;
    CollectionCalendarWrapper(CollectionCalendarWrapper &&) = delete;
    CollectionCalendarWrapper& operator=(CollectionCalendarWrapper &&) = delete;
    ~CollectionCalendarWrapper() override;

    void childEvent(::QChildEvent * event) override;
    void connectNotify(const ::QMetaMethod & signal) override;
    void customEvent(::QEvent * event) override;
    void customPropertyUpdate() override;
    void customPropertyUpdated() override;
    void disconnectNotify(const ::QMetaMethod & signal) override;
    void doSetTimeZone(const ::QTimeZone & timeZone) override;
    void endBatchAdding() override;
    bool event(::QEvent * event) override;
    bool eventFilter(::QObject * watched, ::QEvent * event) override;
    void incidenceUpdate(const ::QString & uid, const ::QDateTime & recurrenceId) override;
    void incidenceUpdated(const ::QString & uid, const ::QDateTime & recurrenceId) override;
    void startBatchAdding() override;
    void timerEvent(::QTimerEvent * event) override;
    void virtual_hook(int id, void * data) override;

    const ::QMetaObject * metaObject() const override;
    int qt_metacall(QMetaObject::Call call, int id, void **args) override;
    void *qt_metacast(const char *_clname) override;
    static void pysideInitQtMetaTypes();

    void resetPyMethodCache();

private:
    mutable std::array<PyObject *, 15> m_PyMethodCache = {nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr};
};

#endif // SBK_COLLECTIONCALENDARWRAPPER_H
