/**
 * 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 "certificate.hpp"
#include "certs_manager.hpp"

#include <systemd/sd-event.h>

#include <sdbusplus/bus.hpp>
#include <sdbusplus/server/manager.hpp>
#include <sdeventplus/event.hpp>

#include <cctype>
#include <string>
#include <utility>

inline std::string capitalize(const std::string& s)
{
    std::string res = s;
    if (!res.empty())
    {
        res[0] = std::toupper(res[0]);
    }
    return res;
}

int main(int argc, char** argv)
{
    phosphor::certs::Arguments arguments;
    if (phosphor::certs::processArguments(argc, argv, arguments) != 0)
    {
        std::exit(EXIT_FAILURE);
    }

    auto bus = sdbusplus::bus::new_default();
    auto objPath = std::string(objectNamePrefix) + '/' + arguments.typeStr +
                   '/' + arguments.endpoint;
    // Add sdbusplus ObjectManager
    sdbusplus::server::manager_t objManager(bus, objPath.c_str());

    // Get default event loop
    auto event = sdeventplus::Event::get_default();

    // Attach the bus to sd_event to service user requests
    bus.attach_event(event.get(), SD_EVENT_PRIORITY_NORMAL);
    phosphor::certs::Manager manager(
        bus, event, objPath.c_str(),
        phosphor::certs::stringToCertificateType(arguments.typeStr),
        arguments.unit, arguments.path);

    // Adjusting Interface name as per std convention
    auto busName = std::string(busNamePrefix) + '.' +
                   capitalize(arguments.typeStr) + '.' +
                   capitalize(arguments.endpoint);
    bus.request_name(busName.c_str());
    event.loop();
    return 0;
}
