// On-call from a program: an alert raised with a dedup key so that repeats join one incident, then
// acknowledged and resolved; a deploy noted; open incidents read and updated through the REST API.
//
//   PAGERDUTY_ROUTING_KEY=... PAGERDUTY_API_TOKEN=... PAGERDUTY_FROM=you@example.com quillo run pagerduty.qwe
//   then open http://localhost:8080/alert, /change, /incidents and /failures
//
// The routing key is from a service's Events API v2 integration. PAGERDUTY_EVENTS_URL and
// PAGERDUTY_API_URL reach test servers.

use "pagerduty.qwer"

let FROM = env("PAGERDUTY_FROM", "")

route GET /alert {
    let key = pagerduty_dedup_key(["checkout", "db-1", "disk-full"])
    let first = pagerduty_trigger("Disk full on db-1", "db-1", "critical", {
        dedup_key: key, component: "postgres", group: "checkout", class: "disk",
        custom_details: { free_mb: 12 },
        links: [{ href: "https://example.com/runbook", text: "Runbook" }],
    })?
    let repeat_alert = pagerduty_trigger("Disk full on db-1", "db-1", "critical", { dedup_key: key })?
    let made_up = pagerduty_trigger("No key given", "web-1", "warning", {})?
    {
        key: key,
        joined: first.dedup_key == repeat_alert.dedup_key,
        made: len(made_up.dedup_key) > 0,
        message: first.message,
        ack: pagerduty_acknowledge(key, {})?.status,
        done: pagerduty_resolve(key, {})?.status,
    }
}

route GET /change {
    let r = pagerduty_change("Deployed checkout 2.4", "ci", { custom_details: { version: "2.4" }, links: [{ href: "https://example.com/r/2.4", text: "Release" }] })?
    { status: r.status, retried: pagerduty_trigger("flaky network", "web-1", "info", {})?.status }
}

route GET /incidents {
    let open = pagerduty_incidents({ statuses: ["triggered", "acknowledged"], sort_by: "created_at:desc" })?
    let one = pagerduty_incident(open[0].id, {})?
    let updated = pagerduty_incident_update(open[0].id, "acknowledged", FROM, {})?
    let note = pagerduty_note(open[0].id, "Looking into it", FROM, {})?
    {
        total: len(open),
        capped: len(pagerduty_incidents({ statuses: ["triggered", "acknowledged"], max_items: 120 })?),
        title: one.title,
        status: updated.status,
        note: note.content,
        bad: pagerduty_incident_update(open[0].id, "closed", FROM, {}).error,
    }
}

// No network: the same parts give the same key; an odd or long one is hashed.
route GET /keys = {
    plain: pagerduty_dedup_key(["a", "b"]),
    spaced: len(pagerduty_dedup_key(["a b"])),
    long: len(pagerduty_dedup_key([repeat("x", 300)])),
    same: pagerduty_dedup_key(["é"]) == pagerduty_dedup_key(["é"]),
}

route GET /failures = {
    bad_severity: pagerduty_trigger("x", "y", "fatal", {}).error,
    no_summary: pagerduty_trigger(" ", "y", "info", {}).error,
    bad_key: pagerduty_trigger("x", "y", "info", { routing_key: "short" }).error,
    refused: pagerduty_trigger("x", "y", "info", { routing_key: "00000000000000000000000000000000" }).error,
    long_dedup: pagerduty_resolve(repeat("k", 256), {}).error,
    no_from: pagerduty_incident_update("PT4KHLK", "resolved", "", {}).error,
    missing: pagerduty_incident("NOPE", {}).error,
    bad_token: pagerduty_incident("PT4KHLK", { token: "wrong" }).error,
}
