/**
 * 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;

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