// A site's Cloudflare account from a program: DNS records listed past a page and upserted, the cache
// purged by URL, and Workers KV read and written, with Cloudflare's error envelope read.
//
//   CLOUDFLARE_API_TOKEN=... CLOUDFLARE_ZONE_ID=... CLOUDFLARE_ACCOUNT_ID=... CLOUDFLARE_KV_NAMESPACE=... quillo run cloudflare.qwe
//   then open http://localhost:8080/dns, /purge, /kv and /failures
//
// The token needs Zone DNS Edit, Cache Purge and Workers KV Storage Edit. CLOUDFLARE_API_URL reaches
// a test server.

use "cloudflare.qwer"

let ZONE = env("CLOUDFLARE_ZONE_ID", "")
let NS = env("CLOUDFLARE_KV_NAMESPACE", "")

route GET /dns {
    let made = cloudflare_dns_create(ZONE, { type: "A", name: "new.example.com", content: "192.0.2.1", ttl: 300, proxied: false }, {})?
    let same = cloudflare_dns_upsert(ZONE, { type: "A", name: "new.example.com", content: "192.0.2.9", ttl: 300, proxied: true }, {})?
    let fresh = cloudflare_dns_upsert(ZONE, { type: "TXT", name: "_verify.example.com", content: "quillo=1" }, {})?
    let all = cloudflare_dns_list(ZONE, {})?
    let txt = cloudflare_dns_list(ZONE, { type: "TXT", name: "_verify.example.com" })?
    cloudflare_dns_delete(ZONE, fresh.id, {})?
    {
        zone: cloudflare_zone_id("example.com", {})? == ZONE,
        kept_id: same.id == made.id,
        content: same.content,
        proxied: same.proxied,
        total: len(all),
        found: len(txt),
        left: len(cloudflare_dns_list(ZONE, { type: "TXT" })?),
    }
}

route GET /purge {
    let files = map(range(0, 65), (i) => `https://example.com/a/${i}.css`)
    {
        requests: cloudflare_purge(ZONE, files, {})?,
        tags: cloudflare_purge_by(ZONE, "tags", ["product-1"], {})?,
        all: cloudflare_purge_all(ZONE, {})?,
        bad_kind: cloudflare_purge_by(ZONE, "everything", ["x"], {}).error,
    }
}

route GET /kv {
    cloudflare_kv_put(NS, "greeting/en", "hello wörld", {})?
    cloudflare_kv_put(NS, "session 1", "{\"user\":7}", { expiration_ttl: 3600 })?
    cloudflare_kv_put(NS, "with-meta", "x", { metadata: { owner: "ada" } })?
    cloudflare_kv_bulk(NS, map(range(0, 25), (i) => { key: `bulk/${i}`, value: `v${i}` }), {})?
    let keys = cloudflare_kv_keys(NS, "bulk/", {})?
    let read = cloudflare_kv_get(NS, "greeting/en", {})?
    cloudflare_kv_delete(NS, "greeting/en", {})?
    {
        read: read,
        spaced: json.parse(cloudflare_kv_get(NS, "session 1", {})?).user,
        gone: cloudflare_kv_get(NS, "greeting/en", {})?,
        keys: len(keys),
        all: len(cloudflare_kv_keys(NS, "", {})?),
        meta: filter(cloudflare_kv_keys(NS, "with", {})?, (k) => k.name == "with-meta")[0].metadata.owner,
        short_ttl: cloudflare_kv_put(NS, "x", "y", { expiration_ttl: 30 }).error,
    }
}

route GET /failures = {
    bad_token: cloudflare_dns_list(ZONE, { token: "wrong" }).error,
    no_zone: cloudflare_dns_list("0000", {}).error,
    invalid: cloudflare_dns_create(ZONE, { type: "A", name: "bad.example.com", content: "not an ip" }, {}).error,
    edge: cloudflare_request("GET", "/edge-error", null, {}).error,
    waited: len(cloudflare_request("GET", "/rate-me", null, {})?.result),
    unknown_zone: cloudflare_zone_id("nowhere.example", {}).error,
    no_name: cloudflare_dns_upsert(ZONE, { content: "x" }, {}).error,
}
