// Who holds a domain or an address: IANA is asked first, the registry and the registrar after it,
// and the fields that differ in every server's format come out with one name each. A domain
// about to expire is flagged, a free name says so, and a rate limit is an error, not a "no".
//
//   quillo run whois.qwe      then open http://localhost:8080/domain/example.com
//
// Be gentle: registries limit queries per address. WHOIS_HOST changes where a look-up starts, and
// WHOIS_ROUTES sends a named server elsewhere, for a network that blocks port 43.

use "whois.qwer"

let FAST = { timeout_ms: 2000 }

route GET /domain/:name {
    let r = whois_lookup(name, FAST)?
    { found: r.found, chain: len(r.servers), fields: r.fields }
}

route GET /available/:name {
    let held = whois_registered(name, FAST)
    if is_err(held) { return { name: name, unknown: held.error } }
    { name: name, available: !held }
}

route GET /renew/:name {
    let r = whois_lookup(name, FAST)?
    let left = r.fields.expires ? whois_days_left(r.fields.expires, 1793318400) : null
    { expires: r.fields.expires, days_left: left, soon: left != null && left < 30 }
}

route GET /ip/:address {
    let r = whois_lookup(address, FAST)?
    { kind: r.kind, chain: len(r.servers), fields: r.fields }
}

route GET /as/:number = whois_lookup(number, FAST)?.fields

route GET /checks = {
    empty: whois_lookup(" ", FAST).error,
    injected: whois_lookup("example.com\r\nsecond question", FAST).error,
    stopped: whois_lookup("example.com", { ...FAST, follow: false })?.servers,
    offline: whois_lookup("example.com", { server: "127.0.0.1:1", timeout_ms: 300 }).error,
}

// Text from a registry, without a network.
route GET /parse = whois_parse("domain: EXAMPLE.DE\nnserver: A.NIC.DE.\nnserver: b.nic.de\nchanged: 2026.01.15\nexpires: 31-Dec-2027\nstatus: connect\n>>> Last update of WHOIS database: 2026-11-01 <<<\nregistrar: not this one\n")
