#pragma once

#include "software_update.hpp"

#include <sdbusplus/async/context.hpp>
#include <xyz/openbmc_project/Association/Definitions/aserver.hpp>
#include <xyz/openbmc_project/Software/Activation/aserver.hpp>
#include <xyz/openbmc_project/Software/ActivationBlocksTransition/aserver.hpp>
#include <xyz/openbmc_project/Software/ActivationProgress/aserver.hpp>
#include <xyz/openbmc_project/Software/Version/aserver.hpp>
#include <xyz/openbmc_project/Software/Version/client.hpp>

#include <string>

namespace phosphor::software::device
{
class Device;
}

namespace phosphor::software
{

using SoftwareActivationBlocksTransition = sdbusplus::aserver::xyz::
    openbmc_project::software::ActivationBlocksTransition<Software>;

using SoftwareVersion =
    sdbusplus::aserver::xyz::openbmc_project::software::Version<Software>;
using SoftwareActivation =
    sdbusplus::aserver::xyz::openbmc_project::software::Activation<Software>;
using SoftwareAssociationDefinitions =
    sdbusplus::aserver::xyz::openbmc_project::association::Definitions<
        Software>;

// This represents a software version running on the device.
class Software : private SoftwareActivation
{
  public:
    Software(sdbusplus::async::context& ctx, device::Device& parent);

    // Set the activation status of this software
    // @param activation         The activation status
    void setActivation(SoftwareActivation::Activations activation);

    // Add / remove the 'ActivationBlocksTransition' dbus interface.
    // This dbus interface is only needed during the update process.
    // @param enabled       determines if the dbus interface should be there
    void setActivationBlocksTransition(bool enabled);

    // This should populate 'softwareUpdate'
    // @param allowedApplyTimes        When updates to this Version can be
    // applied
    void enableUpdate(const std::set<RequestedApplyTimes>& allowedApplyTimes);

    // This should populate 'softwareVersion'
    // @param version         the version string
    // @param versionPurpose  which kind of software
    void setVersion(const std::string& versionStr,
                    SoftwareVersion::VersionPurpose versionPurpose =
                        SoftwareVersion::VersionPurpose::Unknown);

    // Return the version purpose
    SoftwareVersion::VersionPurpose getPurpose();

    // This should populate 'softwareAssociationDefinitions'
    // @param isRunning             if the software version is currently running
    // on the device. Otherwise the software is assumed to be activating (not
    // yet running).
    sdbusplus::async::task<> createInventoryAssociations(bool isRunning);

    // object path of this software
    sdbusplus::message::object_path objectPath;

    // The device we are associated to, meaning this software is either running
    // on the device, or could potentially run on that device (update).
    device::Device& parentDevice;

    // The software id
    const std::string swid;

    // This is only required during the activation of the new fw
    // and is deleted again afterwards.
    // This member is public since the device specific update function
    // needs to update the progress.
    std::unique_ptr<sdbusplus::aserver::xyz::openbmc_project::software::
                        ActivationProgress<Software>>
        softwareActivationProgress = nullptr;

    static long int getRandomId();

  protected:
    // @returns        a random software id (swid) for that device
    static std::string getRandomSoftwareId(device::Device& parent);

  private:
    Software(sdbusplus::async::context& ctx, device::Device& parent,
             const std::string& swid);

    // Dbus interface to prevent power state transition during update.
    std::unique_ptr<SoftwareActivationBlocksTransition>
        activationBlocksTransition = nullptr;

    // The software update dbus interface is not always present.
    // It is constructed if the software version is able to be updated.
    // For the new software version, this interface is constructed after the
    // update has taken effect
    std::unique_ptr<update::SoftwareUpdate> updateIntf = nullptr;

    // We do not know the software version until we parse the PLDM package.
    // Since the Activation interface needs to be available
    // before then, this is nullptr until we get to know the version.
    std::unique_ptr<SoftwareVersion> version = nullptr;

    // This represents our association to the inventory item in case
    // this software is currently on the device.
    std::unique_ptr<SoftwareAssociationDefinitions> associationDefinitions =
        nullptr;

    sdbusplus::async::context& ctx;

    friend update::SoftwareUpdate;
};

}; // namespace phosphor::software
