/*
// 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 <boost/asio.hpp>
#include <phosphor-logging/elog-errors.hpp>
#include <sdbusplus/asio/object_server.hpp>
#include <xyz/openbmc_project/Common/error.hpp>

#include <chrono>
#include <ctime>
#include <filesystem>
#include <string>

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);
