#include "comm_module.hpp"

#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 "session.hpp"

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

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},
        // Get Channel Cipher Suites Command
        {{(static_cast<uint32_t>(message::PayloadType::IPMI) << 16) |
          static_cast<uint16_t>(::command::NetFns::APP) | 0x54},
         &getChannelCipherSuites,
         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)
    {
        command::Table::get().registerCommand(
            iter.command,
            std::make_unique<command::NetIpmidEntry>(
                iter.command, iter.functor, iter.privilege, iter.sessionless));
    }
}

} // namespace command
