/* -*- Mode: C++; indent-tabs-mode: nil; tab-width: 4 -*-
 * -*- coding: utf-8 -*-
 *
 * Copyright (C) 2025 KylinSoft Co., Ltd.
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published
 * the Free Software Foundation, either version 3 of the License, or
 * any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

#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();
}
}
