/*
// 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 <phosphor-logging/lg2.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 constexpr const char* subStateListening = "listening";
static constexpr const char* loadStateNotFound = "not-found";

using ListUnitsType =
    std::tuple<std::string, std::string, std::string, std::string, std::string,
               std::string, sdbusplus::message::object_path, uint32_t,
               std::string, sdbusplus::message::object_path>;

enum class ListUnitElements
{
    name,
    descriptionString,
    loadState,
    activeState,
    subState,
    followedUnit,
    objectPath,
    queuedJobType,
    jobType,
    jobObject
};

static inline std::string addInstanceName(const std::string& instanceName,
                                          const std::string& suffix)
{
    return (instanceName.empty() ? "" : suffix + instanceName);
}

void checkAndThrowInternalFailure(boost::system::error_code& ec,
                                  const std::string& msg);

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