// A sales pipeline kept in Pipedrive: a person, a deal with custom fields set by name instead of by
// their 40-character keys, an activity, and lists through their cursors.
//
//   PIPEDRIVE_API_TOKEN=... PIPEDRIVE_API_URL=https://yourcompany.pipedrive.com quillo run pipedrive.qwe
//   then open /deal, /fields, /activity, /lists and /failures

use "pipedrive.qwer"

route GET /deal {
    let p = pipedrive_person_create({ name: "Ada Lovelace", emails: ["ada@example.com"], phones: ["+44 20 7946 0000"] })?
    let d = pipedrive_deal_create({ title: "Annual plan", value: 1200, currency: "EUR", person_id: p.id, custom: { Region: "Europe", Seats: 12, Channels: ["Web", "Phone"] } })?
    let read = pipedrive_named("deal", pipedrive_deal(d.id)?)?
    let moved = pipedrive_named("deal", pipedrive_deal_update(d.id, { custom: { Region: "Asia" } })?)?
    {
        title: read.title, custom: read.custom, moved: moved.custom.Region,
        primary: pipedrive_person(p.id)?.emails[0],
        found: map(pipedrive_person_search("Ada")?, (x) => x.name),
    }
}

route GET /fields {
    let keys_of = pipedrive_custom("deal", { Region: "Europe", Seats: 3 })?
    {
        count: len(pipedrive_fields("deal", false)?),
        key_length: map(keys(keys_of), (k) => len(k)),
        region_id: keys_of["a1f4f6c8e2d04b0f8a3c7f1e5b9d2c4e6f8a0b1c"],
        no_field: pipedrive_custom("deal", { Colour: "Red" }).error,
        no_option: pipedrive_custom("deal", { Region: "Mars" }).error,
        no_entity: pipedrive_fields("note", false).error,
    }
}

route GET /activity {
    let d = pipedrive_deal_create({ title: "Follow up" })?
    let a = pipedrive_activity_create({ subject: "Call Ada", type: "call", due_date: "2026-11-10", deal_id: d.id })?
    let done = pipedrive_activity_done(a.id)?
    {
        was: a.done, now: done.done,
        of_deal: map(pipedrive_activities({ deal_id: d.id }, 0)?, (x) => x.subject),
        no_type: pipedrive_activity_create({ subject: "x" }).error,
    }
}

route GET /lists = {
    deals: len(pipedrive_deals({ status: "open" }, 0)?),
    capped: len(pipedrive_deals({ status: "open" }, 130)?),
    persons: len(pipedrive_persons({}, 0)?) >= 105,
}

route GET /failures = {
    missing: pipedrive_deal(999999).error,
    no_title: pipedrive_deal_create({ value: 1 }).error,
    short: pipedrive_person_search("a").error,
    in_200: pipedrive_deal(999998).error,
    waited: pipedrive_deal(777)?.title,
    daily: pipedrive_deal(778).error,
}
