/**
 * Copyright © 2018 IBM Corporation
 *
 * 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 "config.h"

#include "argument.hpp"
#include "certs_manager.hpp"

#include <iostream>
#include <locale>
#include <string>

static void ExitWithError(const char* err, char** argv)
{
    phosphor::certs::util::ArgumentParser::usage(argv);
    std::cerr << std::endl;
    std::cerr << "ERROR: " << err << std::endl;
    exit(EXIT_FAILURE);
}

inline void capitalize(std::string& s)
{
    s[0] = std::toupper(s[0]);
}

int main(int argc, char** argv)
{
    // Read arguments.
    auto options = phosphor::certs::util::ArgumentParser(argc, argv);

    // Parse arguments
    auto type = std::move((options)["type"]);
    if ((type == phosphor::certs::util::ArgumentParser::empty_string) ||
        !((type == phosphor::certs::SERVER) ||
          (type == phosphor::certs::CLIENT)))
    {
        ExitWithError("type not specified or invalid.", argv);
    }

    auto endpoint = std::move((options)["endpoint"]);
    if (endpoint == phosphor::certs::util::ArgumentParser::empty_string)
    {
        ExitWithError("endpoint not specified.", argv);
    }

    auto path = std::move((options)["path"]);
    if (path == phosphor::certs::util::ArgumentParser::empty_string)
    {
        ExitWithError("path not specified.", argv);
    }

    // unit is an optional parameter
    auto unit = std::move((options)["unit"]);

    auto bus = sdbusplus::bus::new_default();

    auto objPath = std::string(OBJPATH) + '/' + type + '/' + endpoint;

    phosphor::certs::Manager manager(bus, objPath.c_str(), type,
                                     std::move(unit), std::move(path));

    // Adjusting Interface name as per std convention
    capitalize(type);
    capitalize(endpoint);
    auto busName = std::string(BUSNAME) + '.' + type + '.' + endpoint;
    bus.request_name(busName.c_str());

    while (true)
    {
        // process dbus calls / signals discarding unhandled
        bus.process_discard();
        bus.wait();
    }
    return 0;
}
