#include "session_cmds.hpp"

#include <iostream>

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

namespace command
{

std::vector<uint8_t> setSessionPrivilegeLevel(
        const std::vector<uint8_t>& inPayload, const message::Handler& handler)
{
    std::cout << ">> setSessionPrivilegeLevel\n";

    std::vector<uint8_t> outPayload(sizeof(SetSessionPrivLevelResp));
    auto request = reinterpret_cast<const SetSessionPrivLevelReq*>
                   (inPayload.data());
    auto response = reinterpret_cast<SetSessionPrivLevelResp*>
                    (outPayload.data());
    response->completionCode = IPMI_CC_OK;
    uint8_t reqPrivilegeLevel = request->reqPrivLevel;

    auto session = (std::get<session::Manager&>(singletonPool).getSession(
                       handler.sessionID)).lock();

    if (reqPrivilegeLevel == 0) // Just return present privilege level
    {
        response->newPrivLevel = static_cast<uint8_t>(session->curPrivLevel);
    }
    else if (reqPrivilegeLevel <= static_cast<uint8_t>(session->maxPrivLevel))
    {
        session->curPrivLevel = static_cast<session::Privilege>
                                (reqPrivilegeLevel);
        response->newPrivLevel = reqPrivilegeLevel;
    }
    else
    {
        // Requested level exceeds Channel and/or User Privilege Limit
        response->completionCode = IPMI_CC_EXCEEDS_USER_PRIV;
    }

    std::cout << "<< setSessionPrivilegeLevel\n";
    return outPayload;
}

std::vector<uint8_t> closeSession(const std::vector<uint8_t>& inPayload,
                                  const message::Handler& handler)
{
    std::cout << ">> closeSession\n";

    std::vector<uint8_t> outPayload(sizeof(CloseSessionResponse));
    auto request = reinterpret_cast<const CloseSessionRequest*>
                   (inPayload.data());
    auto response = reinterpret_cast<CloseSessionResponse*>(outPayload.data());
    response->completionCode = IPMI_CC_OK ;

    auto bmcSessionID = endian::from_ipmi(request->sessionID);

    // Session 0 is needed to handle session setup, so session zero is never
    // closed
    if (bmcSessionID == session::SESSION_ZERO)
    {
        response->completionCode = IPMI_CC_INVALID_SESSIONID;
    }
    else
    {
        auto status = std::get<session::Manager&>(singletonPool).stopSession
                        (bmcSessionID);
        if(!status)
        {
            response->completionCode = IPMI_CC_INVALID_SESSIONID;
        }
    }

    std::cout << "<< closeSession\n";
    return outPayload;
}

} // namespace command
