#include "PipewireMetadata.h"

#include "PipewireManager1.h"

namespace UkuiAudioFramwork
{
#define PIPEWIRE_CAST(x) PipewireMetadata* _this = static_cast<PipewireMetadata*>(x);

//-----------------------------------------------------------------------------
static int metadata_property(void *data,
                             uint32_t id,
                             const char* key,
                             const char* type,
                             const char* value)
{
    PIPEWIRE_CAST(data);
    return _this->_metadata_property(id, key, type, value);
}

int PipewireMetadata::_metadata_property(uint32_t id,
                                          const char* key,
                                          const char* type,
                                          const char* value)
{
//    if (key == nullptr) {
//        emit onAllKeysRemoved(id);
//    } else if (value == nullptr) {
//        emit onKeyRemoved(id, key);
//    } else {
//        emit onKeyUpdated(id, key, type, value);
//    }

    return 0;
}

static const pw_metadata_events metadata_events {
    .version = PW_VERSION_METADATA_EVENTS,
    .property = metadata_property,
};

//-----------------------------------------------------------------------------

PipewireMetadata::PipewireMetadata(Pipewire *parent, uint32_t id, const spa_dict* props)
    : pipewire(parent)
{
    metadata = static_cast<pw_metadata*>(
                   pw_registry_bind(parent->registry, id, PW_TYPE_INTERFACE_Metadata, PW_VERSION_METADATA, 0));
    pw_metadata_add_listener(metadata,
                             &metadata_listener,
                             &metadata_events,
                             this);
    parent->resync();
}

PipewireMetadata::~PipewireMetadata()
{
    spa_hook_remove(&metadata_listener);
    if (metadata != nullptr) {
        pw_proxy_destroy((struct pw_proxy*) metadata);
    }
}

//-----------------------------------------------------------------------------

void PipewireMetadata::setProperty(const char *key, const char *value)
{
    pw_metadata_set_property(metadata,
                             0,
                             key,
                             nullptr,
                             value);
    pipewire->round_trip();
}
}
