///| Work item operations

///|
fn include_kind(item_kind : WorkItemKind, kind : WorkItemKind?) -> Bool {
  match kind {
    None => true
    Some(value) => item_kind == value
  }
}

///|
fn include_state(item_state : WorkItemState, state : WorkItemState?) -> Bool {
  match state {
    None => true
    Some(value) => item_state == value
  }
}

///|
pub fn Hub::get_work_item(
  self : Hub,
  objects : &@lib.ObjectStore,
  work_item_id : String,
) -> WorkItem? {
  let record = self.store.get_record(objects, work_item_meta_key(work_item_id))
  match record {
    None => None
    Some(r) => {
      if !is_work_item_record_kind(r.kind) {
        return None
      }
      let item = parse_work_item(r.payload) catch { _ => return None }
      Some(item)
    }
  }
}

///|
pub fn Hub::list_work_items(
  self : Hub,
  objects : &@lib.ObjectStore,
  state? : WorkItemState? = None,
  kind? : WorkItemKind? = None,
) -> Array[WorkItem] {
  let result : Array[WorkItem] = []
  let records = self.store.list_records(objects, work_item_meta_prefix())
  for record in records {
    if !record.key.has_suffix("/meta") {
      continue
    }
    if !is_work_item_record_kind(record.kind) {
      continue
    }
    let item = parse_work_item(record.payload) catch { _ => continue }
    if !include_kind(item.kind(), kind) {
      continue
    }
    if !include_state(item.state(), state) {
      continue
    }
    result.push(item)
  }
  result.sort_by(fn(a, b) {
    if a.created_at < b.created_at {
      -1
    } else if a.created_at > b.created_at {
      1
    } else {
      0
    }
  })
  result
}