#pragma once

#include <functional>
#include <map>

#include <host-ipmid/ipmid-api.h>
#include "message_handler.hpp"

namespace command
{

union CommandID
{
    uint32_t command;

    uint8_t reserved;
    message::PayloadType payloadType;

    union
    {
        uint8_t netFn: 6;
        uint8_t lun: 2;

        uint8_t netFnLun;
    } NetFnLun;

    uint8_t cmd;
} __attribute__((packed));

/**
 * CommandFunctor is the functor register for commands defined in
 * phosphor-net-ipmid. This would take the request part of the command as a
 * vector and a reference to the message handler. The response part of the
 * command is returned as a vector.
 */
using CommandFunctor = std::function<std::vector<uint8_t>(
        const std::vector<uint8_t>&, const message::Handler&)>;

/**
 * @struct CmdDetails
 *
 * Command details is used to register commands supported in phosphor-net-ipmid.
 */
struct CmdDetails
{
    CommandID command;
    CommandFunctor functor;
    session::Privilege privilege;
    bool sessionless;
};

/**
 * @enum NetFns
 *
 * A field that identifies the functional class of the message. The Network
 * Function clusters IPMI commands into different sets.
 */
enum class NetFns
{
    CHASSIS            = (0x00 << 10),
    CHASSIS_RESP       = (0x01 << 10),

    BRIDGE             = (0x02 << 10),
    BRIDGE_RESP        = (0x03 << 10),

    SENSOR             = (0x04 << 10),
    SENSOR_RESP        = (0x05 << 10),
    EVENT              = (0x04 << 10),
    EVENT_RESP         = (0x05 << 10),

    APP                = (0x06 << 10),
    APP_RESP           = (0x07 << 10),

    FIRMWARE           = (0x08 << 10),
    FIRMWARE_RESP      = (0x09 << 10),

    STORAGE            = (0x0A << 10),
    STORAGE_RESP       = (0x0B << 10),

    TRANSPORT          = (0x0C << 10),
    TRANSPORT_RESP     = (0x0D << 10),

    //>>
    RESERVED_START     = (0x0E << 10),
    RESERVED_END       = (0x2B << 10),
    //<<

    GROUP_EXTN         = (0x2C << 10),
    GROUP_EXTN_RESP    = (0x2D << 10),

    OEM                = (0x2E << 10),
    OEM_RESP           = (0x2F << 10),
};

/**
 * @class Entry
 *
 * This is the base class for registering IPMI commands. There are two ways of
 * registering commands to phosphor-net-ipmid, the session related commands and
 * provider commands
 *
 * Every commands has a privilege level which mentions the minimum session
 * privilege level needed to execute the command
 */

class Entry
{

    public:
        Entry(CommandID command, session::Privilege privilege):
            command(command),
            privilege(privilege) {}

        /**
         * @brief Execute the command
         *
         * Execute the command
         *
         * @param[in] commandData - Request Data for the command
         * @param[in] handler - Reference to the Message Handler
         *
         * @return Response data for the command
         */
        virtual std::vector<uint8_t> executeCommand(
            std::vector<uint8_t>& commandData,
            const message::Handler& handler) = 0;

        auto getCommand() const
        {
            return command;
        }

        auto getPrivilege() const
        {
            return privilege;
        }

        virtual ~Entry() = default;
        Entry(const Entry&) = default;
        Entry& operator=(const Entry&) = default;
        Entry(Entry&&) = default;
        Entry& operator=(Entry&&) = default;

    protected:
        CommandID command;

        //Specifies the minimum privilege level required to execute this command
        session::Privilege privilege;
};

/**
 * @class NetIpmidEntry
 *
 * NetIpmidEntry is used to register commands that are consumed only in
 * phosphor-net-ipmid. The RAKP commands, session commands and user management
 * commands are examples of this.
 *
 * There are certain IPMI commands that can be executed before session can be
 * established like Get System GUID, Get Channel Authentication Capabilities
 * and RAKP commands.
 */
class NetIpmidEntry final: public Entry
{

    public:
        NetIpmidEntry(CommandID command,
                      CommandFunctor functor,
                      session::Privilege privilege,
                      bool sessionless):
            Entry(command, privilege),
            functor(functor),
            sessionless(sessionless) {}

        /**
         * @brief Execute the command
         *
         * Execute the command
         *
         * @param[in] commandData - Request Data for the command
         * @param[in] handler - Reference to the Message Handler
         *
         * @return Response data for the command
         */
        std::vector<uint8_t> executeCommand(std::vector<uint8_t>& commandData,
                                            const message::Handler& handler)
                                            override;

        virtual ~NetIpmidEntry() = default;
        NetIpmidEntry(const NetIpmidEntry&) = default;
        NetIpmidEntry& operator=(const NetIpmidEntry&) = default;
        NetIpmidEntry(NetIpmidEntry&&) = default;
        NetIpmidEntry& operator=(NetIpmidEntry&&) = default;

    private:
        CommandFunctor functor;

        bool sessionless;
};

/**
 * @class ProviderIpmidEntry
 *
 * ProviderIpmidEntry is used to register commands to the Command Table, that
 * are registered by IPMI provider libraries.
 *
 */
class ProviderIpmidEntry final: public Entry
{
    public:
        ProviderIpmidEntry(CommandID command,
                           ipmid_callback_t functor,
                           session::Privilege privilege):
            Entry(command, privilege),
            functor(functor) {}

        /**
         * @brief Execute the command
         *
         * Execute the callback handler
         *
         * @param[in] commandData - Request Data for the command
         * @param[in] handler - Reference to the Message Handler
         *
         * @return Response data for the command
         */
        std::vector<uint8_t> executeCommand(std::vector<uint8_t>& commandData,
                                            const message::Handler& handler)
                                            override;

        virtual ~ProviderIpmidEntry() = default;
        ProviderIpmidEntry(const ProviderIpmidEntry&) = default;
        ProviderIpmidEntry& operator=(const ProviderIpmidEntry&) = default;
        ProviderIpmidEntry(ProviderIpmidEntry&&) = default;
        ProviderIpmidEntry& operator=(ProviderIpmidEntry&&) = default;

    private:
        ipmid_callback_t functor;
};

/**
 * @class Table
 *
 * Table keeps the IPMI command entries as a sorted associative container with
 * Command ID as the unique key. It has interfaces for registering commands
 * and executing a command.
 */
class Table
{
    public:

        Table() = default;
        ~Table() = default;
        // Command Table is a singleton so copy, copy-assignment, move and
        // move assignment is deleted
        Table(const Table&) = delete;
        Table& operator=(const Table&) = delete;
        Table(Table&&) = default;
        Table& operator=(Table&&) = default;

        using CommandTable = std::map<uint32_t, std::unique_ptr<Entry>>;

        /**
         * @brief Register a command
         *
         * Register a command with the command table
         *
         * @param[in] inCommand - Command ID
         * @param[in] entry - Command Entry
         *
         * @return: None
         *
         * @note Registering an already registered command will overwrite the
         *       existing entry with the new one.
         */
        void registerCommand(CommandID inCommand,
                             std::unique_ptr<Entry>&& entry);

        /**
         * @brief Execute the command
         *
         * Execute the command for the corresponding CommandID
         *
         * @param[in] inCommand - Command ID to execute.
         * @param[in] commandData - Request Data for the command
         * @param[in] handler - Reference to the Message Handler
         *
         * @return Response data for the command
         */
        std::vector<uint8_t> executeCommand(uint32_t inCommand,
                                            std::vector<uint8_t>& commandData,
                                            const message::Handler& handler);
    private:
        CommandTable commandTable;
};

}// namespace command
