#include "comm_module.hpp"

#include <algorithm>
#include <cstring>
#include <iomanip>
#include <iostream>

#include "command/channel_auth.hpp"
#include "command/open_session.hpp"
#include "command/rakp12.hpp"
#include "command/rakp34.hpp"
#include "command/session_cmds.hpp"
#include "command_table.hpp"
#include "main.hpp"
#include "session.hpp"

namespace command
{

void sessionSetupCommands()
{
    static const command::CmdDetails commands[] =
    {
        // Open Session Request/Response
        {
            {
                (static_cast<uint32_t>
                (message::PayloadType::OPEN_SESSION_REQUEST) << 16)
            },
            &openSession, session::Privilege::HIGHEST_MATCHING,  true
        },
        // RAKP1 & RAKP2 Message
        {
            {(static_cast<uint32_t>(message::PayloadType::RAKP1) << 16)},
            &RAKP12, session::Privilege::HIGHEST_MATCHING, true
        },
        // RAKP3 & RAKP4 Message
        {
            {(static_cast<uint32_t>(message::PayloadType::RAKP3) << 16)},
            &RAKP34, session::Privilege::HIGHEST_MATCHING, true
        },
        // Get Channel Authentication Capabilities Command
        {
            {
                (static_cast<uint32_t>(message::PayloadType::IPMI) << 16) |
                static_cast<uint16_t>(command::NetFns::APP) | 0x38
            },
            &GetChannelCapabilities,
            session::Privilege::HIGHEST_MATCHING, true
        },
        // Set Session Privilege Command
        {
            {
                (static_cast<uint32_t>(message::PayloadType::IPMI) << 16) |
                static_cast<uint16_t>(command::NetFns::APP) | 0x3B
            },
            &setSessionPrivilegeLevel, session::Privilege::USER, false
        },
        // Close Session Command
        {
            {
                (static_cast<uint32_t>(message::PayloadType::IPMI) << 16) |
                static_cast<uint16_t>(command::NetFns::APP) | 0x3C
            },
            &closeSession, session::Privilege::CALLBACK, false
        },
    };

    for (auto& iter : commands)
    {
        std::get<command::Table&>(singletonPool).registerCommand(
            iter.command, std::make_unique<command::NetIpmidEntry>
            (iter.command, iter.functor, iter.privilege, iter.sessionless));
    }
}

} // namespace command
