#include <drogon/Cookie.h>
#include <drogon/utils/Utilities.h>
#include <trantor/utils/Logger.h>
using namespace drogon;
std::string Cookie::cookieString() const
{
    constexpr std::string_view prefix = "Set-Cookie: ";
    std::string ret;
    ret.reserve(prefix.size() + key_.size() + value_.size() + 30);
    ret = prefix;
    ret.append(key_).append("=").append(value_).append("; ");
    if (expiresDate_.microSecondsSinceEpoch() !=
            (std::numeric_limits<int64_t>::max)() &&
        expiresDate_.microSecondsSinceEpoch() >= 0)
    {
        ret.append("Expires=")
            .append(utils::getHttpFullDateStr(expiresDate_))
            .append("; ");
    }
    if (maxAge_.has_value())
    {
        ret.append("Max-Age=")
            .append(std::to_string(maxAge_.value()))
            .append("; ");
    }
    if (!domain_.empty())
    {
        ret.append("Domain=").append(domain_).append("; ");
    }
    if (!path_.empty())
    {
        ret.append("Path=").append(path_).append("; ");
    }
    if (sameSite_ != SameSite::kNull)
    {
        switch (sameSite_)
        {
            case SameSite::kLax:
                ret.append("SameSite=Lax; ");
                break;
            case SameSite::kStrict:
                ret.append("SameSite=Strict; ");
                break;
            case SameSite::kNone:
                ret.append("SameSite=None; ");
                ret.append("Secure; ");
                break;
            default:
                ret.append("SameSite=Lax; ");
        }
    }
    if ((secure_ && sameSite_ != SameSite::kNone) || partitioned_)
    {
        ret.append("Secure; ");
    }
    if (httpOnly_)
    {
        ret.append("HttpOnly; ");
    }
    if (partitioned_)
    {
        ret.append("Partitioned; ");
    }
    ret.resize(ret.length() - 2);  
    ret.append("\r\n");
    return ret;
}