MODULE = Protocol::HTTP                PACKAGE = Protocol::HTTP::Response
PROTOTYPES: DISABLE

BOOT {
    Stash s(__PACKAGE__);
    s.inherit("Protocol::HTTP::Message");
    xs::exp::create_constants(s, {
        {"COOKIE_SAMESITE_DISABLED", int(Response::Cookie::SameSite::disabled)},
        {"COOKIE_SAMESITE_STRICT",   int(Response::Cookie::SameSite::Strict)},
        {"COOKIE_SAMESITE_LAX",      int(Response::Cookie::SameSite::Lax)},
        {"COOKIE_SAMESITE_NONE",     int(Response::Cookie::SameSite::None)},
    });
    xs::exp::autoexport(s);
}

ResponseSP Response::new (Hash params = Hash()) {
    RETVAL = make_backref<Response>();
    if (params) fill(RETVAL, params);
}

int Response::code (SV* newval = NULL) {
    if (newval) {
        THIS->code = SvIV(newval);
        XSRETURN_UNDEF;
    }
    RETVAL = THIS->code;
}

string Response::message (SV* newval = NULL) {
    if (newval) {
        THIS->message = xs::in<string>(newval);
        XSRETURN_UNDEF;
    }
    RETVAL = THIS->message;
}

string Response::to_string (Request* req = nullptr)

string Response::message_for_code (int code = 0) {
    RETVAL = THIS->message_for_code(code ? code : THIS->code);
}

Hash Response::cookies (Hash new_cookies = Hash()) {
    if (new_cookies) {
        set_response_cookies(THIS, new_cookies);
        XSRETURN_UNDEF;
    }

    RETVAL = Hash::create(THIS->cookies.size());
    for (const auto& elem : THIS->cookies.fields) RETVAL.store(elem.name, xs::out(elem.value));
}

Response::Cookie Response::cookie (string_view name, SV* val = nullptr) {
    if (val) {
        if (!SvOK(val)) THIS->cookies.remove(name);
        else            THIS->cookies.set(string(name), xs::in<Response::Cookie>(val));
        XSRETURN_UNDEF;
    }

    auto it = THIS->cookies.find(name);
    if (it == THIS->cookies.end()) XSRETURN_UNDEF;
    RETVAL = it->value;
}