/*
// Copyright (c) 2018 Intel 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.
*/
#pragma once
#include <ctime>
#include <chrono>
#include <string>
#include <sdbusplus/asio/object_server.hpp>
#include <phosphor-logging/elog-errors.hpp>
#include <xyz/openbmc_project/Common/error.hpp>
#include <experimental/filesystem>
#include <boost/asio.hpp>

static constexpr const char *sysdStartUnit = "StartUnit";
static constexpr const char *sysdStopUnit = "StopUnit";
static constexpr const char *sysdRestartUnit = "RestartUnit";
static constexpr const char *sysdReloadMethod = "Reload";
static constexpr const char *sysdGetJobMethod = "GetJob";
static constexpr const char *sysdReplaceMode = "replace";
static constexpr const char *dBusGetAllMethod = "GetAll";
static constexpr const char *dBusGetMethod = "Get";
static constexpr const char *sysdService = "org.freedesktop.systemd1";
static constexpr const char *sysdObjPath = "/org/freedesktop/systemd1";
static constexpr const char *sysdMgrIntf = "org.freedesktop.systemd1.Manager";
static constexpr const char *sysdUnitIntf = "org.freedesktop.systemd1.Unit";
static constexpr const char *sysdSocketIntf = "org.freedesktop.systemd1.Socket";
static constexpr const char *dBusPropIntf = "org.freedesktop.DBus.Properties";
static constexpr const char *stateMasked = "masked";
static constexpr const char *stateEnabled = "enabled";
static constexpr const char *stateDisabled = "disabled";
static constexpr const char *subStateRunning = "running";

static inline std::string addInstanceName(const std::string &instanceName,
                                          const std::string &suffix)
{
    return (instanceName.empty() ? "" : suffix + instanceName);
}

void systemdDaemonReload(
    const std::shared_ptr<sdbusplus::asio::connection> &conn,
    boost::asio::yield_context yield);

void systemdUnitAction(const std::shared_ptr<sdbusplus::asio::connection> &conn,
                       boost::asio::yield_context yield,
                       const std::string &unitName,
                       const std::string &actionMethod);

void systemdUnitFilesStateChange(
    const std::shared_ptr<sdbusplus::asio::connection> &conn,
    boost::asio::yield_context yield, const std::vector<std::string> &unitFiles,
    const std::string &unitState, bool maskedState, bool enabledState);
