/*
 *
 *    Copyright (c) 2021-2022 Project CHIP Authors
 *    All rights reserved.
 *
 *    Licensed under the Apache License, Version 2.0 (the "License");
 *    you may not use this file except in compliance with the License.
 *    You may obtain a copy of the License at
 *
 *        http://www.apache.org/licenses/LICENSE-2.0
 *
 *    Unless required by applicable law or agreed to in writing, software
 *    distributed under the License is distributed on an "AS IS" BASIS,
 *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *    See the License for the specific language governing permissions and
 *    limitations under the License.
 */

#include "OptionsProxy.h"

#include <cstring>

#include <app_control.h>

#include <platform/CHIPDeviceBuildConfig.h>

namespace {

struct Option
{
    const char * name;
    bool isBoolean;
};

// NOTE: Keep this list in sync with the sDeviceOptionDefs
//       from examples/platform/linux/Options.cpp
static constexpr Option sOptions[] = {
#if CHIP_DEVICE_CONFIG_ENABLE_CHIPOBLE
    { "ble-device", false },
#endif
#if CHIP_DEVICE_CONFIG_ENABLE_WPA
    { "wifi", true },
#endif
#if CHIP_ENABLE_OPENTHREAD
    { "thread", true },
#endif
    { "version", false },
    { "vendor-id", false },
    { "product-id", false },
    { "custom-flow", false },
    { "capabilities", false },
    { "discriminator", false },
    { "passcode", false },
    { "spake2p-verifier-base64", false },
    { "spake2p-salt-base64", false },
    { "spake2p-iterations", false },
    { "secured-device-port", false },
    { "secured-commissioner-port", false },
    { "unsecured-commissioner-port", false },
    { "command", false },
    { "PICS", false },
    { "KVS", false },
    { "interface-id", false },
#if CHIP_CONFIG_TRANSPORT_TRACE_ENABLED
    { "trace_file", false },
    { "trace_log", false },
#endif
};

bool ParseAppExtraData(app_control_h app_control, const char * key, void * userData)
{
    auto * args = static_cast<std::vector<std::string> *>(userData);

    for (const auto & option : sOptions)
    {
        if (strcmp(key, option.name) != 0)
        {
            continue;
        }

        char * value = nullptr;
        if (app_control_get_extra_data(app_control, option.name, &value) == APP_CONTROL_ERROR_NONE && value != nullptr)
        {
            if (!option.isBoolean)
            {
                args->push_back(std::string("--") + option.name);
                args->push_back(value);
            }
            else if (strcmp(value, "true") == 0)
            {
                args->push_back(std::string("--") + option.name);
            }
            // Release memory allocated by app_control_get_extra_data()
            free(value);
        }
    }

    // Continue iterating over all extra data
    return true;
}

}; // namespace

void OptionsProxy::Parse(const char * argv0, app_control_h app_control)
{
    // Insert argv[0] commonly used as a process name
    if (argv0 != nullptr)
    {
        mArgs.push_back(argv0);
    }

    app_control_foreach_extra_data(app_control, ParseAppExtraData, &mArgs);

    // Convert vector of strings into NULL-terminated vector of char pointers
    mArgv.reserve(mArgs.size() + 1);
    for (auto & arg : mArgs)
    {
        mArgv.push_back(arg.c_str());
    }
    mArgv.push_back(nullptr);
}
