/**
 * 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) ||
          (type == phosphor::certs::AUTHORITY)))
    {
        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;

    // Add sdbusplus ObjectManager
    sdbusplus::server::manager::manager objManager(bus, objPath.c_str());

    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;
}
