// ============================================================
// vqt6/_bridge.h — C 桥接层头文件
//
// 作用: 把 Qt6 C++ API 包装成 extern "C" 函数，供 Viper FFI 调用
// 编译: 作为静态库 libvqt6_bridge.a 或动态库 vqt6_bridge.dll
// ============================================================

#ifndef VQT6_BRIDGE_H
#define VQT6_BRIDGE_H

#include <stddef.h>
#include <stdint.h>

#if defined(_WIN32)
#  if defined(VQT6_BRIDGE_STATIC)
#    define VQT6_API
#  elif defined(VQT6_BRIDGE_BUILD)
#    define VQT6_API __declspec(dllexport)
#  else
#    define VQT6_API __declspec(dllimport)
#  endif
#else
#  if defined(__GNUC__) && (__GNUC__ >= 4)
#    define VQT6_API __attribute__((visibility("default")))
#  else
#    define VQT6_API
#  endif
#endif

#ifdef __cplusplus
extern "C" {
#endif

// ============================================================
// QString
// ============================================================
VQT6_API void*  vqt6_qstring_create(const char* utf8);
VQT6_API size_t vqt6_qstring_to_utf8(void* qstr, char* buf, size_t buf_size);
VQT6_API void   vqt6_qstring_free(void* qstr);
VQT6_API int    vqt6_qstring_length(void* qstr);
VQT6_API int    vqt6_qstring_is_empty(void* qstr);
VQT6_API int    vqt6_qstring_equals(void* qstr, void* other);
VQT6_API void*  vqt6_qstring_append(void* qstr, void* other);

// ============================================================
// QByteArray
// ============================================================
VQT6_API void*  vqt6_qbytearray_create(const void* data, size_t size);
VQT6_API void*  vqt6_qbytearray_data(void* qba, size_t* out_size);
VQT6_API size_t vqt6_qbytearray_size(void* qba);
VQT6_API void   vqt6_qbytearray_free(void* qba);

// ============================================================
// QObject
// ============================================================
VQT6_API void   vqt6_qobject_delete(void* obj);
VQT6_API void   vqt6_qobject_delete_later(void* obj);
VQT6_API void   vqt6_qobject_set_object_name(void* obj, void* name);
VQT6_API void*  vqt6_qobject_object_name(void* obj);
VQT6_API void   vqt6_qobject_set_parent(void* child, void* parent);
VQT6_API void*  vqt6_qobject_parent(void* obj);
VQT6_API int    vqt6_qobject_connect(void* sender, const char* signal_name,
                                     void* receiver, const char* slot_name);
VQT6_API int    vqt6_qobject_disconnect(void* sender, const char* signal_name,
                                        void* receiver, const char* slot_name);
VQT6_API void   vqt6_qobject_install_event_filter(void* watched, void* filter);
VQT6_API void   vqt6_qobject_remove_event_filter(void* watched, void* filter);

// ============================================================
// QCoreApplication
// ============================================================
VQT6_API void*  vqt6_qcoreapp_create(const char* app_name);
VQT6_API void*  vqt6_qcoreapp_instance(void);
VQT6_API int    vqt6_qcoreapp_exec(void* app);
VQT6_API void   vqt6_qcoreapp_quit(void* app, int exit_code);
VQT6_API void   vqt6_qcoreapp_exit(void* app, int exit_code);
VQT6_API void   vqt6_qcoreapp_process_events(void* app, int flags);
VQT6_API void   vqt6_qcoreapp_post_event(void* receiver, void* event);
VQT6_API int    vqt6_qcoreapp_send_event(void* receiver, void* event);
VQT6_API void*  vqt6_qcoreapp_organization_name(void* app);
VQT6_API void   vqt6_qcoreapp_set_organization_name(void* app, void* name);
VQT6_API void*  vqt6_qcoreapp_application_name(void* app);
VQT6_API void   vqt6_qcoreapp_set_application_name(void* app, void* name);

// ============================================================
// QTimer
// ============================================================
VQT6_API void*  vqt6_qtimer_create(void);
VQT6_API void*  vqt6_qtimer_create_with_parent(void* parent);
VQT6_API void   vqt6_qtimer_start(void* timer, int interval_ms);
VQT6_API void   vqt6_qtimer_stop(void* timer);
VQT6_API void   vqt6_qtimer_set_interval(void* timer, int interval_ms);
VQT6_API int    vqt6_qtimer_interval(void* timer);
VQT6_API int    vqt6_qtimer_is_active(void* timer);
VQT6_API void   vqt6_qtimer_set_single_shot(void* timer, int single_shot);
VQT6_API int    vqt6_qtimer_is_single_shot(void* timer);

// ============================================================
// QVariant
// ============================================================
VQT6_API void*  vqt6_qvariant_create_int(int value);
VQT6_API void*  vqt6_qvariant_create_double(double value);
VQT6_API void*  vqt6_qvariant_create_bool(int value);
VQT6_API void*  vqt6_qvariant_create_string(void* s);
VQT6_API int    vqt6_qvariant_to_int(void* v, int* ok);
VQT6_API double vqt6_qvariant_to_double(void* v, int* ok);
VQT6_API int    vqt6_qvariant_to_bool(void* v, int* ok);
VQT6_API void*  vqt6_qvariant_to_string(void* v);
VQT6_API int    vqt6_qvariant_type_id(void* v);
VQT6_API int    vqt6_qvariant_is_valid(void* v);
VQT6_API void   vqt6_qvariant_free(void* v);

// ============================================================
// QEvent
// ============================================================
VQT6_API int    vqt6_qevent_type(void* event);
VQT6_API void   vqt6_qevent_accept(void* event);
VQT6_API void   vqt6_qevent_ignore(void* event);
VQT6_API int    vqt6_qevent_is_accepted(void* event);

// ============================================================
// QStringList
// ============================================================
VQT6_API void*  vqt6_qstringlist_create(void);
VQT6_API void   vqt6_qstringlist_append(void* list, void* str);
VQT6_API int    vqt6_qstringlist_size(void* list);
VQT6_API void*  vqt6_qstringlist_at(void* list, int index);
VQT6_API void   vqt6_qstringlist_free(void* list);

// ============================================================
// QByteArrayList
// ============================================================
VQT6_API void*  vqt6_qbytearraylist_create(void);
VQT6_API void   vqt6_qbytearraylist_append(void* list, void* qba);
VQT6_API int    vqt6_qbytearraylist_size(void* list);
VQT6_API void*  vqt6_qbytearraylist_at(void* list, int index);
VQT6_API void   vqt6_qbytearraylist_free(void* list);

// ============================================================
// 全局回调注册表
// ============================================================
typedef void (*vqt6_slot_callback_t)(int slot_id, void* user_data);
VQT6_API void   vqt6_register_slot(int slot_id, void* user_data);
VQT6_API void   vqt6_unregister_slot(int slot_id);
VQT6_API void   vqt6_trigger_slot(int slot_id);

#ifdef __cplusplus
}
#endif

#endif // VQT6_BRIDGE_H
