sub init()
    m.top.functionName = "run"
end sub

sub run()
    m.top.result = postJson(m.top.url, m.top.body)
end sub

function postJson(url as String, body as String) as Object
    xfer = CreateObject("roUrlTransfer")
    port = CreateObject("roMessagePort")
    xfer.SetMessagePort(port)
    xfer.SetUrl(url)
    xfer.SetCertificatesFile("common:/certs/ca-bundle.crt")
    xfer.InitClientCertificates()
    xfer.AddHeader("Content-Type", "application/json")

    ok = xfer.AsyncPostFromString(body)
    if ok = false then return { success:false, message:"Falha ao iniciar login" }

    msg = wait(20000, port)
    if type(msg) = "roUrlEvent" then
        code = msg.GetResponseCode()
        raw = msg.GetString()
        if code < 200 or code >= 300 then return { success:false, message:"HTTP " + code.ToStr() }
        if raw = invalid or raw = "" then return { success:false, message:"Resposta vazia da API" }

        parsed = ParseJson(raw)
        if parsed = invalid then return { success:false, message:"JSON inválido da API" }

        if parsed.success = true then
            return { success:true, data:parsed }
        end if

        msgText = "Login inválido"
        if parsed.message <> invalid then msgText = parsed.message
        return { success:false, message:msgText, data:parsed }
    end if

    xfer.AsyncCancel()
    return { success:false, message:"Timeout no login" }
end function
