/*
// 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 <sdbusplus/timer.hpp>
#include "utils.hpp"

namespace phosphor
{
namespace service
{

static constexpr const char *serviceConfigSrvName =
    "xyz.openbmc_project.Control.Service.Manager";
static constexpr const char *serviceConfigIntfName =
    "xyz.openbmc_project.Control.Service.Attributes";
static constexpr const char *srcCfgMgrBasePath =
    "/xyz/openbmc_project/control/service";
static constexpr const char *srvCfgPropPort = "Port";
static constexpr const char *srvCfgPropMasked = "Masked";
static constexpr const char *srvCfgPropEnabled = "Enabled";
static constexpr const char *srvCfgPropRunning = "Running";

enum class UpdatedProp
{
    port = 1,
    maskedState,
    enabledState,
    runningState
};

using VariantType =
    std::variant<std::string, int64_t, uint64_t, double, int32_t, uint32_t,
                 int16_t, uint16_t, uint8_t, bool,
                 std::vector<std::tuple<std::string, std::string>>>;

class ServiceConfig
{
  public:
    ServiceConfig(sdbusplus::asio::object_server &srv_,
                  std::shared_ptr<sdbusplus::asio::connection> &conn_,
                  const std::string &objPath_, const std::string &baseUnitName,
                  const std::string &instanceName,
                  const std::string &serviceObjPath,
                  const std::string &socketObjPath);
    ~ServiceConfig() = default;

    std::shared_ptr<sdbusplus::asio::connection> conn;
    uint8_t updatedFlag;

    void stopAndApplyUnitConfig(boost::asio::yield_context yield);
    void restartUnitConfig(boost::asio::yield_context yield);
    void startServiceRestartTimer();

  private:
    sdbusplus::asio::object_server &server;
    std::shared_ptr<sdbusplus::asio::dbus_interface> iface;
    bool internalSet = false;
    std::string objPath;
    std::string instanceName;
    std::string baseUnitName;
    std::string instantiatedUnitName;
    std::string socketObjectPath;
    std::string serviceObjectPath;
    std::string overrideConfDir;

    // Properties
    std::string activeState;
    std::string subState;
    uint16_t portNum;
    std::vector<std::string> channelList;
    std::string protocol;
    std::string stateValue;
    bool unitMaskedState = false;
    bool unitEnabledState = false;
    bool unitRunningState = false;
    std::string subStateValue;

    bool isMaskedOut();
    void registerProperties();
    void queryAndUpdateProperties();
    void createSocketOverrideConf();
    void updateServiceProperties(
        const boost::container::flat_map<std::string, VariantType>
            &propertyMap);
    void updateSocketProperties(
        const boost::container::flat_map<std::string, VariantType>
            &propertyMap);
    std::string getSocketUnitName();
    std::string getServiceUnitName();
};

} // namespace service
} // namespace phosphor
